
算法
GoingJack
怕什么真理无穷,进一寸有一寸欢喜。
展开
-
数组特殊格式打印{1,2,3,4,5,6}{12,23,34,45,56}{123,234,345,456}{1234,2345,3456}{12345,23456}{123456}
/*题目要求:给定一个整型数组,要求按照以下给定例子,写出打印函数。数组:arr[1]={1};打印结果:1数组:arr[2]={1,2};打印结果:1 212数组:arr[3]={1,2,3};打印结果:1 2 312 23123数组:arr[4]={1,2,3,4};打印结果:1 2 3 412 23 34123 2341234...原创 2019-03-31 20:06:48 · 2986 阅读 · 0 评论 -
【算法题:火柴棒变换问题】C++实现
题目要求用火柴棒摆出的0-9的数字:如下规则:1.移动一根火柴棒可以变为另一个数字2.增加一根火柴棒可以变为另一个数字3.减少一根火柴棒可以变为另一个数字给出一个10以内的简单的四则运算表达式如:9-6=21.如果该表达式成立,直接输出“等式成立”2.变换左操作数是否能使等式成立,输出变化后的等式3.变换右操作数是否能使等式成立,输出变化后的等式4.变换左右操作数是否能...原创 2019-07-07 14:02:35 · 2330 阅读 · 0 评论 -
C++-istreamstring-分割字符串string的一个类
头文件#include <sstream>使用方法-使用istringstream分割string默认以空格作为分隔符#include <iostream>#include <string>#include <sstream>using namespace std;int main(){ string str = "1...原创 2019-07-07 14:21:41 · 1515 阅读 · 0 评论 -
排序算法之计数排序
void CountSort(vector<int> &vec){ if (vec.size() <= 1) { return; } int len = vec.size(); int max = vec[0]; int min = vec[0]; for (int i = 0; i < len; ++i) { if (vec[i] &g...原创 2019-07-20 21:54:50 · 129 阅读 · 0 评论 -
排序算法之鸡尾酒排序
话不多说直接上代码:void CockTailSort(vector<int> &vec){ if (vec.size() <= 1) { return; } int len = vec.size(); bool flag = true; for (int i = 0; i < len && flag ; ++i) { ...原创 2019-07-20 22:26:29 · 160 阅读 · 0 评论 -
动态规划-如何求解金矿问题
参考书籍《漫画算法-小灰的算法之旅》5.11问题描述假设现在有5座金矿,每座金矿的黄金存储量不同,需要参入挖掘的工人人数也不同。要求:参入挖矿的工人的总数是10.每座金矿要么全挖,要么不挖,不能派出一半人挖取一般黄金。要求用程序求出,要想得到尽可能多的黄金,应该选取那几座金矿?金矿内容:400,500,200,300,350所需人数:5,5,3,4,3递归算法思路对于每...原创 2019-08-06 22:06:53 · 696 阅读 · 0 评论 -
动态规划-leetcode474一和零问题
问题描述在计算机界中,我们总是追求用有限的资源获取最大的收益。现在,假设你分别支配着m个0和n个1。另外,还有一个仅包含0和1字符串的数组。你的任务是使用给定的m个0和n个1,找到能拼出存在于数组中的字符串的最大数量。每个0和1至多被使用一次。注意:给定0和1的数量都不会超过100。 给定字符串数组的长度不会超过600...原创 2019-08-07 00:39:30 · 458 阅读 · 0 评论 -
关于对数器的使用
有一个你想测试的方法a 实现一个绝对正确但是复杂度不好的方法b 实现一个随机样本产生器 实现比对的方法 把方法a和方法b比对很多次来验证方法a是否正确 如果有一个样本使得比对出错,打印样本分析是那个方法出错。 当样本很多时比对测试依然正确,可以确定方法a已经正确。下面这个例子就是对归并排序的对数器的使用的测试。void merge(vector<int> &...原创 2019-08-19 12:55:16 · 133 阅读 · 0 评论 -
已知Right 和 Left 求中间值 Mid注意点
一般来说我们直接写成Mid = (Right + Left)/2的形式,但是这个形式存在很多隐患问题。一般来说这样写比较安全Mid = Left + (Right - Left)/21,整数溢出的情况代码:int Right = INT_MAX - 1;int Left = INT_MAX - 2;int Mid = (Right + Left) /...原创 2019-08-19 13:26:50 · 783 阅读 · 0 评论 -
利用归并思想求解一个数组的逆序对的个数
int merge(vector<int> &arr, int l, int m, int r){ int i = 0; int p1 = l; int p2 = m + 1; int result = 0; vector<int> help; help.resize(r - l + 1); while (p1 <= m &&...原创 2019-08-19 14:53:24 · 241 阅读 · 0 评论 -
翻转数列
时间限制:1秒空间限制:32768K小Q定义了一种数列称为翻转数列:给定整数n和m, 满足n能被2m整除。对于一串连续递增整数数列1, 2, 3, 4..., 每隔m个符号翻转一次, 最初符号为'-';。例如n = 8, m = 2, 数列就是: -1, -2, +3, +4, -5, -6, +7, +8.而n = 4, m = 1, 数列就是: -1, +2, -3, + 4....原创 2019-08-16 10:06:27 · 595 阅读 · 0 评论 -
纸牌游戏
牛牛和羊羊正在玩一个纸牌游戏。这个游戏一共有n张纸牌, 第i张纸牌上写着数字ai。牛牛和羊羊轮流抽牌, 牛牛先抽, 每次抽牌他们可以从纸牌堆中任意选择一张抽出, 直到纸牌被抽完。他们的得分等于他们抽到的纸牌数字总和。现在假设牛牛和羊羊都采用最优策略, 请你计算出游戏结束后牛牛得分减去羊羊得分等于多少。输入描述:输入包括两行。第一行包括一个正整数n(1 <= n <...原创 2019-08-16 10:17:12 · 1377 阅读 · 0 评论 -
贪吃的小Q
小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力输入描述:每个输入包含一个测试用例。每个测试用例的第一行包含两个正整数,表示父母出差的天数N(N<=50000)和巧克力的数量M(N<=M<=100000)。输出描述:输出一...原创 2019-08-16 10:50:41 · 756 阅读 · 0 评论 -
快速排序的递归和非递归写法
递归:void QuickSort(vector<int> &vec,int low,int high){ int i = low; int j = high; int tmp = vec[low]; while (i < j) { while (i < j&&vec[j] >= tmp)--j; vec[i] ...原创 2019-08-16 15:35:55 · 639 阅读 · 0 评论 -
关于二叉树的前中后序遍历的非递归写法
#include<stack>#include<iostream>using namespace std;struct TreeNode{ int val; TreeNode *lchild; TreeNode *rchild;};void perOrder(TreeNode &root){ stack<TreeNode *> s...原创 2019-08-21 22:49:36 · 216 阅读 · 0 评论 -
给定一个数组,给定一个target,给定结果数组的个数k,求这个数组的子数组个数为k且子数组所有元素和为target所有子数组
思路:求得这个数组的所有子集的情况,然后将子集数组的元素个数为k的子数组的所有元素求和,判断是否等于target如果等于打印子数组。代码:int target = 7;void printvector(vector<int> arr){ for (int val : arr) { cout << val << " "; ...原创 2019-08-29 13:45:29 · 1083 阅读 · 0 评论 -
使用vector和string心得
vector在做算法题的时候有些方法特别有用,先特总结如下。sort(vec_sampleMD.begin(), vec_sampleMD.end());//排序vec_sampleMD.erase(unique(vec_sampleMD.begin(), vec_sampleMD.end()), vec_sampleMD.end());//去重sort(vec.begin(), vec...原创 2019-07-11 00:29:05 · 336 阅读 · 0 评论 -
【汇编】汇编实现求大数阶乘问题
开发环境Windows 10 专业版开发工具Microsoft Visual Studio Community 2017版本15.9.12测试结果是否正确的网站https://zh.numberempire.com/factorialcalculator.php主要思路 大数乘法思路参考:C++代码实现#include<iostream>...原创 2019-07-05 00:42:00 · 2357 阅读 · 0 评论 -
求1000以内的完数
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。C++代码使用STL模板库 set#include <iostream>#include <set>using namespace std; ...原创 2019-06-28 18:35:19 · 1695 阅读 · 0 评论 -
打印杨辉三角<C语言><二维数组><格式化>
void YHTriangle(int Row)//参数传入打印的行数。{ assert(Row > 0); int i, j; //按照给定的行数在堆空间上申请二维数组用来存放杨辉三角。 int **arr = (int **)malloc(sizeof(int *)*Row); for (i = 0; i < Row; i++) { arr[i] = (int ...原创 2019-03-31 23:29:55 · 330 阅读 · 0 评论 -
解决约瑟夫问题 -循环链表
问题:n个人围成一圈,从某个人开始算step个数,被数到的那个人被淘汰,求最后的胜利者。typedef struct Node{ int val; struct Node *next; struct Node *pre;//用于存放头节点的前一个元素,其实这里我并不是准备定义双向链表}Node;int Joseph(Node *head,int step,int n){ ...原创 2019-04-01 00:05:06 · 309 阅读 · 0 评论 -
二叉排序树-C语言
二叉排序树(BST)(二叉搜索树,二叉查找树):或者是一棵空树,或者是具有下列性质的二叉树:1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;3. 它的左、右子树也分别为二叉排序树。//定义树的结构体typedef struct BiNode { int data; stru...原创 2019-04-01 21:29:37 · 362 阅读 · 0 评论 -
各种排序算法
参考链接:https://www.cnblogs.com/onepixel/articles/7674659.html交换俩个数据void Swap(int *element1, int *element2){ int tmp = *element1; *element1 = *element2; *element2 = tmp;}冒泡排序:从前往后比较相邻俩个数据,如果前面...原创 2019-04-11 17:55:31 · 239 阅读 · 0 评论 -
C语言使用结构体,一维数组和函数(方法)模拟二维数组。
无论几维数组,在内存中的存储都是顺序存储了,二维数组只是我们自己抽象的出来一个数据结构。下面代码用到了结构体做为操作对象,函数作为方法自我定义了类二维数组的数据结构。#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>...原创 2019-04-12 22:46:37 · 1735 阅读 · 0 评论 -
关于递归斐波那契数列的效率问题。
常规的递归求斐波那契数列的代码为:时间复杂度为O(2^n).int FiBo_Recursion(int n)//递归求 时间复杂度O(n^2){ if (n == 1 || n == 2) { return 1; } else return FiBo_Recursion(n - 1) + FiBo_Recursion(n - 2);}其时间复杂度高的原因是因为做了大...原创 2019-04-16 14:26:23 · 1355 阅读 · 0 评论 -
KMP算法-字符串匹配问题
【题目】给定俩个字符串str和match,长度分别为N和M。实现一个算法,如果字符串str中含有字串match,则返回match在str中的开始位置,不含有则返回-1;【举例】str="acbc",match="bc",返回2.str="acbc",match="bcc",返回-1.【解答】普通解法 从左到右遍历str的每一个字符。然后看如果以当前字符作为第一个...原创 2019-04-19 15:31:10 · 599 阅读 · 0 评论 -
求子集和求全排列
全排列:【引子】给定一个普通的递归函数(Swap为交换函数,交换俩个数据。这里不做过多的说明。)void fun(int *arr,int k,int m){ if(k==m){} else { for(int i = k; i < m; i++) { Swap(arr[k],arr[i]); ...原创 2019-04-19 16:43:13 · 793 阅读 · 0 评论 -
关于二分法查找的问题
【题目要求】在给定的有序数组中,查找一个给定的val的值,返回它的位置。【循环实现】:int BinaryFind(int *arr, int n, int val){ int pos = -1; if (arr == NULL || n < 1) return pos; int left = 0, right = n - 1; while (left <= ...原创 2019-04-20 00:32:00 · 635 阅读 · 0 评论 -
C语言统计字符串中单词的个数
【说明】you're,I'm ,类似这种的单词是一个单词。主要思路就是,从头到尾遍历字符串,不同的状态直接的切换可以确定是否为单词的个数加1.当状态从在单词里转换为不在单词里时,单词的个数加1.#define BEGIN 0#define INWORD 1#define OUTWORD 2#define END 3int GetWordNums(const char...原创 2019-04-25 15:34:37 · 4857 阅读 · 0 评论 -
(异或运算的使用)不使用临时变量交换俩个元素的值
举个栗子:我们使用的运算是 异或运算。(简称为:不进位的加法运算)首先我们假设a = 001 b = 010 那么我们给a赋值a = a ^ b = 011;此时我们接着进行 a ^ b 计算结果赋值给bb = a ^ b = 001;接着进行 a ^ b 计算结果赋值给aa = a ^ b = 010;这样我们便没有使用任何变量交换了来个变量的值。函数实...原创 2019-06-02 15:54:10 · 323 阅读 · 0 评论 -
使用C++解决迷宫深度搜索路径问题解法(二)广度遍历,寻找一条最优解线路
#include <iostream>using namespace std;//const int RIGHT = 0;const int DOWN = 1;const int LEFT = 2;const int UP = 3;//const int YES = 4;const int NO = 5;class Node {public: int _x;...原创 2019-06-21 00:01:53 · 1000 阅读 · 0 评论 -
使用C++解决迷宫深度搜索路径问题解法(一)
// 深度遍历迷宫路径搜索.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>using namespace std;/*深度遍历搜索迷宫路径,软件运行要求如下:请输入迷宫的行列数(例如:10 10):5 5请输入迷宫的路径信息(0表示可以走,1表示不能走):0 0 0 1 1 1 0 0 0 1 1...原创 2019-06-17 11:37:31 · 1270 阅读 · 0 评论 -
辗除法--欧几里得算法求解俩个数的最大公约数,最小公倍数
辗除法:设两数为a、b(b<a),求它们最大公约数(a、b)的步骤如下:用a/b,得a/b=q......r1(0≤r)。若r1=0,则(a,b)=b;若r1≠0,则再用b/r1,得b/r1=q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1/r2,……如此下去,直到能整除为止。其最后一个非零余数即为(a,b)。最大公倍数等于a*b/...原创 2019-06-23 18:39:29 · 376 阅读 · 0 评论 -
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k(这里一般从2开始),然后按下述步骤完成:(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。(2)如果n大于k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。根据以上逻辑写出代码#include &l...原创 2019-06-23 19:06:04 · 1251 阅读 · 0 评论 -
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如 2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
#include <stdio.h>int main(){ int a,n; int sn=0,tn=0,count=1; while(1) { printf("input tow a and n:\n"); scanf("%d%d",&a,&n); while(count &l...原创 2019-06-23 19:10:48 · 2490 阅读 · 0 评论 -
【算法 c++实现】顺时针打印矩阵
思路:剥洋葱的思路,一开始有俩个指针指向左上角和右下角,根据这个分别从左向右,从上向下,从右到左,从下到上,就完成了顺时针遍历矩阵的要求了。然后我们左上角的点向右下移动,右下角的点向左上移动。最终当其位置一样或左上角的位置大于右下角的位置停止遍历。需要注意特殊情况为左上角的点和右下角的点在同一行,或者同一列的情况下的时候我们需要特殊处理。class Solution {...原创 2019-08-30 11:48:04 · 269 阅读 · 0 评论