每天一道算法题
文章平均质量分 70
找工作等面试算法题,总结
攻城狮凌风
专业吹水,从不装B
展开
-
每天一道算法题41-反转链表
除了使用栈的特性或者另外开辟内存从后往前拷贝,另外有两种方法,分别是递归法和遍历法,其中遍历法更加节省内存,递归法写起来逻辑简单。遍历法用图来表示:递归法用图来表示:详细逻辑可以参考:Java单链表反转 详细过程代码如下:#include "iostream"struct NODE_T{ int data; struct NODE_T* pdata;};...原创 2018-12-11 23:54:44 · 304 阅读 · 0 评论 -
每天一道算法题(40)——组成的最小数字
题目: 输入10个数,表示0-9对应的个数,输出用所有的这些数组成的最大数字。注意‘0’不能在开头代码:# include #include"string"using namespace std;int main(){ static int counter[10];//设置计数器 int i; for(i=0;i<10;i++) cin>>counter[i原创 2015-11-04 22:56:38 · 2831 阅读 · 1 评论 -
每天一道算法题(39)——含有重复字符的全排列
思路(1)对于含有重复字符的全排列必须使用isSwap函数(2)整体思路 a,交换当前子字符串(i----n-1)字符与子字符串后面的每一个位置的字符(满足交换条件下) b,子字符串位置后移(i+1-----n)。递归处理子字符串 c,将a中的交换复原。代码#include #include"string"using name原创 2015-11-02 13:02:01 · 1421 阅读 · 0 评论 -
每天一道算法题(38)——二叉树的非递归遍历
#include#include "stack"using namespace std;struct node{ char c; node* left; node *right; bool flag;};void pre(node* head){//非递归前序遍历 stack s; while (head || !s.empty()){ if (head){ co原创 2015-10-13 20:46:28 · 1112 阅读 · 0 评论 -
每天一道算法题(37)——360校招机试之寻找同乡
题目: 输如若干行,第一行输入人的个数n和存在同乡关系的对数m。后面紧接着是m行(m代码:#include #include #includeusing namespace std;void process(int n,int g,vector &v){ int* flag=new int[n+1]; for(int i=0;i<n+1;i++) flag[原创 2015-09-29 21:33:33 · 1922 阅读 · 1 评论 -
每天一道算法题(36)——8皇后问题
题目 要在8*8的国际象棋棋盘中放8个皇后,使任意两个皇后都不能互相吃掉。规则是皇后能吃掉同一行、同一列、同一对角线的棋子。求一种解法。思路 (1)递归法。以列数为状态,每一行的棋子共有8种状态。对每一棋子,依次遍历8种状态,在符合规则的状态下进行递归。 (2)深度有线遍历法。类似于递归法,对于每一层棋子,倘若符合规则,则前进;不符合规则且状态原创 2015-09-09 22:21:59 · 1248 阅读 · 0 评论 -
每天一道算法题(35)——删除字符串首尾的空格
题目: 输入字符串,删除首尾的空格。单词中间只留下一个空格。 如输入“ a b c ”输出“a b c"代码: public static String test1(String s) { StringBuffer sb=new StringBuffer(s.trim()); int j=0; int i; for(;原创 2015-09-07 17:30:17 · 1665 阅读 · 0 评论 -
每天一道算法题(34)——背包问题
1.0-1背包问题 有N件物品和一个能装质量为W的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的总重不超过背包总重,且价值总和最大。这个问题的特点是:每种物品只有一件,可以选择放或者不放。 定义f[i][j]:在前i个物品中用容量为j的包选择所能得到的最大价值。则转移方程:f[i][j]=max{f[i-1][j],f[原创 2015-08-25 21:39:52 · 1470 阅读 · 0 评论 -
每天一道算法题(33)——阿里巴巴之魔方翻转
题目: 阿里巴巴2015秋招机试题目:一个三阶魔方由六个面组成,颜色分别是白色(W)、对面为黄色(Y)、红色(R)、对面为橙色(O)、绿色(G)、对面为蓝色(B)。如果手持魔方,白色向上,红色朝向自己,则绿色在左手侧。请写一个程序,对一个处于还原状态(各面各块同色)的魔方,进行操作,打印操作后的魔方状态。操作指令为单个操作指令组成的字符串。单个操作指令包括:1)U:白色面顺时原创 2015-08-23 20:26:32 · 1424 阅读 · 0 评论 -
每天一道算法题(32)——输出数组中第k小的数
1.题目 快速输出第K小的数2.思路 使用快速排序的思想,递归求解。若键值位置i与k相等,返回。若大于k,则在[start,i-1]中寻找第k大的数。若小于k。则在[i+1,end]中寻找第k+start-i-1小的数。3.代码#include#includeusing namespace std;int choose(int* data,int start原创 2015-08-18 11:25:09 · 762 阅读 · 0 评论 -
每天一道算法题(31)——正数减法
问题描述: 两个任意长度的正数相减,这两个正数可以带小数点,也可以是整数,请输出结果。 输入的字符串中,不会出现除了数字与小数点以外的其它字符,不会出现多个小数点以及小数点在第一个字符的位置等非法情况,所以考生的程序中无须考虑输入的数值字符串非法的情况。详细要求以及约束:1.输入均为正数,但输出可能为负数;2.输入输出均为字符串形式;3.如果输出是正数则不需要带符号,如果为原创 2015-08-14 22:11:50 · 906 阅读 · 0 评论 -
每天一道算法题(30)——高效的求斐波拉契数列
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - 1) + F(n - 2),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围内的非负整数,请设计一个高效算法,计算第n项F(n)。第一个斐波拉契数为F(0) = 1。给定一个非负整数,请返回斐波拉契数列的第n项,为了防止溢出,请将结果Mod 1000000007。原创 2015-08-05 15:52:29 · 1958 阅读 · 0 评论 -
每天一道算法题(29)——检测字符串的是否由移位得到
题目: 字符串ABCD,可以由字符串BCDA或者CDAB通过循环移位而得到。请编程实现以下检测:字符串S1是否可以由字符串S2通 过循环移位而得到。思路: 1.不涉及字符串拷贝,只通过指针移位匹配字符串。 2.遍历s1的所有移位形式,只要有一种形式匹配s2则退出。代码:#include"iostream"using nam原创 2015-08-05 14:04:30 · 665 阅读 · 0 评论 -
每天一道算法题(28)——计算正整数的加、减运算式
题目: 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。 补充说明: 1. 操作数为正整数,不需要考虑计算结果溢出的情况。 2. 若输入算式格式错误,输出结果为“0”。代码:boo原创 2015-08-04 15:13:32 · 769 阅读 · 0 评论 -
每天一道算法题(27)——找出元音字母并排序
题目:原创 2015-08-03 22:17:06 · 1242 阅读 · 0 评论 -
每天一道算法题(26)——输入字符串表达式求值
题目: 输入字符串,求输出的值。输入的均为整形,要求包含运算符 例如输入: "24*1 +(4+6)*2+ (4-3*2) *( 4+6-9+(11-3*4)*2 +2)* 10+ 20 -3* 2 *4 +2" 输出结果:20 要求:对于多余空格字符完好的鲁棒性,函数原型:void process(cons原创 2015-07-31 11:56:51 · 2451 阅读 · 0 评论 -
每天一道算法题(25)——字符串中连续出现次数最多的子串
#include"iostream"#include"string"using namespace std;pair fun(const string& str);int _tmain(int argc, _TCHAR* argv[]){ string str="abcbcbcabc"; pair p=fun(str); cout<<p.first<<": "<<p.secon原创 2015-07-27 14:44:43 · 1015 阅读 · 2 评论 -
每天一道算法题(24)——自定义幂函数pow
double myPower(double base, int exponent){ if(exponent==0) return 1; if(exponent==1) return base; if(exponent==-1)//当为是负数的情况 return 1.0/base; double result=1.0; result=myPower(base,exponen原创 2015-06-25 16:13:54 · 1379 阅读 · 0 评论 -
每天一道算法题(23)——约瑟夫环问题
题目: 已知n个人(以编号0,1,2...n-1分别表示)围坐在一张圆桌周围。从编号为0的人开始报数1,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。问最后的剩下的人。思路: 1.直接使用list模拟约瑟夫环。删除节点 2.第二,分析之。对于n个数而言,剩下的人是f(n,m)=(f原创 2015-07-16 14:43:18 · 935 阅读 · 0 评论 -
每天一道算法题(22)——扑克牌的顺子
题目: 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。思路: 设定王为0。统计非王的牌之间的空格数,若小于王的总数(对应填补),则为顺子。有任意一张牌大于2,为非顺子。代码: bool process(const char*原创 2015-07-16 10:12:53 · 1518 阅读 · 0 评论 -
每天一道算法题(21)——字符串的全排列和组合算法
题目: 用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列,如 abc 的全排列: abc, acb, bca, dac, cab, cba思路: 使用递归的方法。先固定起始位置,使用for循环遍历所有的可能,此时进行字符交换即可。每一层循环中,进行递归,对后一个位置进行改变。代码:#include"iostrea转载 2015-07-07 16:10:23 · 901 阅读 · 0 评论 -
每天一道算法题目(20)——复杂链表的拷贝
题目: 输入复杂链表如图,复制该链表。思路: 如图。传统的做法是先复制next指针部分,然后对于每个节点的random部分,则需要遍历整个链表查找对应节点。时间复杂度为O(n.^2)。时间这里总结一种时间复杂度为O(n)空间复杂度为O(1)的方法。 第一步。简单复制next指针部分,并将拷贝节点和源节点链接一起。 第二原创 2015-07-07 15:49:40 · 742 阅读 · 0 评论 -
每天一道算法题(19)——最近公共父节点问题
给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和最小。描述你程序的最坏时间复杂度,并实现具体函数,函数输入输出请参考如下的函数原型原创 2015-07-06 22:34:22 · 1175 阅读 · 0 评论 -
每天一道算法题目(18)——取等长有序数组的上中位数和不等长有序数组的第k小的数
1.取上中位数 题目: 给定两个有序数组arr1和arr2,两个数组长度都为N,求两个数组中所有数的上中位数。要求:时间复杂度O(logN)。 例如: arr1 = {1,2,3,4}; arr2 = {3,4,5,6}; 一共8个数则上中位数是第4个数,所以返回3。原创 2015-06-30 21:38:01 · 962 阅读 · 0 评论 -
每天一道算法题目(17)——二叉树的子结构
题目: 判断某个二叉树是否为另外一个二叉树的子结构思路: 先判断以当前根节点为根节点的二叉树是否和模板二叉树匹配。倘若不匹配。接着依次判断左右子树是否匹配 匹配函数先比较根节点,若根节点相等,则匹配2者的左右子树代码:bool match(head1,head2)//匹配函数{ if(!head2) retur原创 2015-06-29 09:35:36 · 700 阅读 · 0 评论 -
每天一道算法题(16)——合并已排序的链表
题目 合并已经排序的2条链表思路 递归策略:对于每一层递归,寻找最小的节点,然后嵌套递归 非递归:定义两个指针,初始化指向头结点,比较指针并移动节点指向代码 非递归:ListNode* mergeList(ListNode* List1,ListNode* List2){ if(!List1) return List2;原创 2015-06-29 09:16:30 · 588 阅读 · 0 评论 -
每天一道算法题(15)——打印1到最大的n位数
题目: 打印1到最大的n位数。如n=4,打印1-9999。思路: 由于直接使用循环会导致int或者long long都不够存储。因此使用字符串来存储数据,这里涉及到数字转换成字符串以及字符串的加法。代码: 1.使用递归思路。 可以认为。从高位到低位,高位数先固定,在此情况下,低位数依次调整。每一位原创 2015-06-25 15:52:23 · 799 阅读 · 0 评论 -
每天一道算法题(14)——N个降序数组,找到最大的K个数
题目: 假定有20个有序数组,每个数组有500个数字,降序排列,数字类型32位uint数值,现在需要取出这10000个数字中最大的500个。思路 (1).建立大顶堆,维度为数组的个数,这里为20(第一次 插入的是每个数组中最大的值,即第一个元素)。 (2).删除最大堆堆顶,保存到数组或者栈中,然后向最大堆插入删除的元素所在数组的下一原创 2015-06-18 10:38:34 · 1677 阅读 · 0 评论 -
每天一道算法题(13)——使用递归颠倒栈
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1 在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5 处在栈顶思路: 1.弹出并保存栈顶元素 2.递归,颠倒剩余的栈 3.将栈顶元素保存至栈底代码: //使用递归法,逆转栈templatebool reverseSta原创 2015-06-16 14:15:37 · 2106 阅读 · 1 评论 -
每天一道算法题(12)——和为n的连续正数序列或者随机数
题目:输入一个正数n,输出所有和为n 连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3 个连续序列1-5、4-6 和7-8。1.思路 尊崇以下策略: (1)对于固定的left.当前sum值小于目标Sum,则right一直后移 (2).sum==Sum。则输出序列,且将right后原创 2015-06-15 15:03:32 · 621 阅读 · 0 评论 -
每天一道算法题(11)——栈的push、pop 序列
题目:输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序。为了简单起见,我们假设push 序列的任意两个整数都是不相等的。 例如:输入的push 序列是1、2、3、4、5,那么4、5、3、2、1 就有可能是一个pop 系列1.思路 (1)假设栈顶元素等于输出指针指向元素,弹出栈顶元素并后移输出指针;原创 2015-06-04 11:01:12 · 1191 阅读 · 0 评论 -
每天一道算法题(5)——求2个字符串的最长公共子序列和最长公共子字符串
题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。 例如:输入两个字符串BDCABA 和ABCBDAB,字符串BCBA 和BDAB 都是是它们的最长公共子串,则 输出它们原创 2015-06-01 17:02:18 · 5078 阅读 · 0 评论 -
每天一道算法题(10)——数对之差的最大值
题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16 减去5 的结果。1.思路 Solution1: 将其转换成求最大子数组问题。引入辅助数组diff,长度为n-1。diff[i]=dif[i]-diff[i+1]。求出最大子数组以及位置low,hi原创 2015-05-27 19:59:30 · 1180 阅读 · 0 评论 -
每天一道算法题(9)——在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。 例如输入整数22 和如下二元树10/ \5 12/ \ 4 7 则打印出两条路径:10, 12 和10, 5, 7。1.思路 使用递归和栈结构。原创 2015-05-26 15:58:27 · 1488 阅读 · 0 评论 -
每天一道算法题(8)——把二元查找树转变成排序的双向链表
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。比如将二元查找树10/ \6 14/ \ / \ 4 81216 转换成双向链表4=6=8=10=12=14=161.思路 使用递归法。注意由于需要改变指针的指向,因此使用了指针引用。2.代码#incl原创 2015-05-26 11:20:57 · 661 阅读 · 0 评论 -
每天一道算法题(7)——在字符串中删除特定的字符
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。1.思路 最简单的。设source长n,key 长m(n>>m),则使用简单的遍历查找需要n*m次(n个字符,查找m次),且每次删除对应元素需要O(1)时间(元素移动)。原创 2015-05-22 11:51:49 · 1571 阅读 · 0 评论 -
每天一道算法题(6)——查找2个只出现1次的数字
问题描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 基础:交换先后位置不影响异或结果,偶数个相同的数连续异或为0,0与数异或结果不变。1.思路 (1)全部元素异或,结果一定不为0,且结果为只出现1次的元素的异或。原创 2015-05-21 16:04:57 · 824 阅读 · 0 评论 -
每天一道算法题(4)——O(1)时间内删除链表节点
1.思路 假设链表......---A--B--C--D....,要删除B。一般的做法是遍历链表并记录前驱节点,修改指针,时间为O(n)。删除节点的实质为更改后驱指针指向。这里,复制C的内容至B(此时B,C同时指向D),删除节点C,即达到间接删除节点B的目的。 倘若B是链尾节点。则需要线性遍历寻找前驱节点。 以上思路,时间复杂度为O(1)。原创 2015-05-20 16:28:36 · 804 阅读 · 0 评论 -
每天一道算法题(3)——含有指针元素的模板类
1.定义 倘若没有拷贝构造函数,编译器自动生成的构造拷贝函数或者拷贝运算符的重载函数。在编译器生成的缺省的构造拷贝函数和拷贝运算符的重载函数,对指针实行的是按位拷贝,仅仅只是拷贝指针的地址,而不会拷贝指针的内容。因此在执行完前面的代码之后,指针指向同一地址。当A或者B中任意一个结束其生命周期调用析构函数时,程序就会不可避免地崩溃。因此在此种情况中,一般手动定义拷贝构造函数和重原创 2015-05-18 16:17:08 · 720 阅读 · 0 评论 -
每天一道算法题(2)——求整数的2进制表示中1的个数
Solution1:整数往右移,与1按位与 不适用负数。因为负数的移位自动填补1,程序陷入死循环。int NumberOf1_Solution1(int i){ int count = 0; while(i) { if(i & 1) count ++;原创 2015-05-17 22:48:10 · 921 阅读 · 0 评论