http://zhedahht.blog.163.com/blog/static/25411174200712895228171/
用c++写带min()的stack。
http://zhedahht.blog.163.com/blog/static/254111742007219147591/
求子数组的最大和
http://zhedahht.blog.163.com/blog/static/254111742007228357325/
在二元树中找出和为某一值的所有路径
http://zhedahht.blog.163.com/blog/static/2541117420072432136859/
查找最小的k个元素(可以用快排思想,也可以用set和multiset来实现),STL中map和multiset是红黑树实现的。看代码
http://zhedahht.blog.163.com/blog/static/25411174200725319627/
判断整数序列是不是二元查找树的后序遍历结果
判断指针是否是空指针是很好的习惯。
在排序数组中查找和为给定值的两个数字:
<!--[if !supportLists]-->1. <!--[endif]-->用hash表
<!--[if !supportLists]-->2. <!--[endif]-->窗口,先最小,再找最大的合适的值(从最大往小扫描),再两个同时右移
http://zhedahht.blog.163.com/blog/static/25411174200722191722430/
第一个只出现一次的字符(写程序)
自己构造hash表,char类型的有一个字节(8位),一共有256种情况。
http://zhedahht.blog.163.com/blog/static/25411174200722710364233/
含有指针成员的类的拷贝(深度拷贝和指向该类指针数量)
Fibonacci序列o(n)的时间复杂度求法:从最低往上加(写程序)
参考:http://zhedahht.blog.163.com/blog/static/25411174200722991933440/
http://zhedahht.blog.163.com/blog/static/2541117420073293950662/
用两个栈实现队列(写程序)
以下这段程序是编译同不过的,因为构造函数不能传递实例(值)。会造成堆栈溢出。
A a = 10;这中初始化是正确的,会自动调用A(10)构造函数。
<!--[endif]-->
变量初始化是按定义顺序出事话的,和初始化列表中的顺序无关,所以输出的是随机变量和0.
<!--[endif]-->
输出8.因为pPoint为NULL,也就是0,求z的起始地址,就是sizeof(x)+sizeof(y)
<!--[endif]-->
运行Print2()时会崩溃,因为访问m_value需要this指针,而此时为NULL
<!--[endif]-->
输出1,1,4. 因为调用虚函数的时候会产生一个指向虚函数表的指针。
逆转单链表:
函数最好有返回值,简单且不容易出错。
http://zhedahht.blog.163.com/blog/static/2541117420073471124487/
最长公共子串
递归的思想:
c[i][j]用来存放长度为i和j的两个子串的最长公共子串的长度,如果i==0||j==0则c[i][j]=0,否则c[i][j] = c[i-1][j]>c[i][j-1]?c[i-1][j]:c[i][j-1];
求lcs和输出其序列的代码:
代码需要注意:
输出序列的函数要同时有两个序列
if(dp[i-1][j]>=dp[i][j-1])加“=”和不加遍历的序列不一样,但是都是lcs
32位机器int中,0xffffffff是-1,ox80000000是最小负数-2147483648。
求int数字中有多少个1:
从1到一个正整数的自然数序列中出现过多少次1
21345,
- 考虑1~1345和1346~21345。
- 1346~21345一共有20000个数,所以在最高位就出现过20000次,如果最高位是1则为后面尾数+1
- 后面用2(最高位)依次递归下去。得到结果最终要加上1~1345的递归结果。
1~n中1出现的次数
http://zhedahht.blog.163.com/blog/static/25411174200732494452636/
和为n的连续整数序列
http://zhedahht.blog.163.com/blog/static/25411174200732711051101/
二叉树深度
http://zhedahht.blog.163.com/blog/static/25411174200732975328975/
字符串的排列组合
http://zhedahht.blog.163.com/blog/static/254111742007499363479/
排列代码:
数组重新排序
http://zhedahht.blog.163.com/blog/static/25411174200741295930898/
重点:判断是否是偶数用&而不是用%(效率高);函数解耦,应用函数指针。
赋值运算符重载函数
http://zhedahht.blog.163.com/blog/static/25411174200741543224391/
从尾到头输出链表(栈或者递归)
构建c++不能继承的类
关键:友元,虚继承,静态方法
已知头结点指针和待删除结点指针情况下,用o(1)时间删除链表节点
上面的代码基于两个假设:(1)给定的结点的确在链表中;(2)给定的要删除的结点不是链表的头结点。不考虑第一个假设对代码的鲁棒性是有影响的。至于第二个假设,当整个列表只有一个结点时,代码会有问题。但这个假设不算很过分,因为在有些链表的实现中,会创建一个虚拟的链表头,并不是一个实际的链表结点。这样要删除的结点就不可能是链表的头结点了。当然,在面试中,我们可以把这些假设和面试官交流。这样,面试官还是会觉得我们考虑问题很周到的。
找出数组中只出现一次数数字(很巧妙)
http://zhedahht.blog.163.com/blog/static/2541117420071128950682/
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
找出两个链表第一个公共结点
http://zhedahht.blog.163.com/blog/static/254111742008053169567/
两个思路:1.遍历两个,得到两个长度,l1和l2,使长链表先走|l1-l2|,两个一块走判断地址是否相同。2.用set记录每个地址,遍历第二个链表的时候进行判断。
在字符串中删除特定字符
http://zhedahht.blog.163.com/blog/static/25411174200801931426484/
时间复杂度o(n)
要点:两个指针,字母hash
找出从小到大的1500个丑数
http://zhedahht.blog.163.com/blog/static/2541117420094245366965/
丑数的定义:因数只是2,3或者5的数字。
两种方法:1.从1往后判断,直到1500个丑数都找到为止。2.前面的丑数*2 or *3 or *5得到第一个大于目前最大丑数的数,记住为止,递归。
输出1~n位所有的数,例如n=2 输出 0,1,2...99
http://zhedahht.blog.163.com/blog/static/2541117420094279426862/
颠倒栈
http://zhedahht.blog.163.com/blog/static/25411174200943182411790/
旋转数组的最小元素
http://zhedahht.blog.163.com/blog/static/25411174200952765120546/
o(logn)的时间复杂度。
输出所有筛子可能点数的可能性
1.首先得到每种可能性有多少种组合,存在数组里
2.用数组的值除以所有可能性
字符串到数字的转换
http://zhedahht.blog.163.com/blog/static/25411174200731139971/
注意:
- 正负号
- 非法输入(是否在0~9之间)
- 空字符串
- 数字溢出(是否比std::numeric_limits<int>::max()要大)
数字的整数次幂
http://zhedahht.blog.163.com/blog/static/254111742009101563242535/
注意:
- 非法输入(指数和底数)
- 超出范围
- 性能(分治法)
singleton
http://zhedahht.blog.163.com/blog/static/2541117420105146828433/
构造函数为私有函数,有一个static变量来存放一个对象。也可以有一个static指针,另一个static函数来创建对象(但是在多线程中有问题)。
对称字符串最大长度
http://zhedahht.blog.163.com/blog/static/25411174201063105120425/
普通做法:o(n^3)的复杂度
改进做法:任意两个相邻字符向外扩张o(n^2)
二叉树两个结点的最低公共父节点
http://zhedahht.blog.163.com/blog/static/25411174201081263815813/
二叉排序树,普通二叉树
排序二叉树:当两个值都大于或者小于当前节点时继续查找,直到一个大于一个小于就说明找到了该节点。
普通二叉树:最低公共父节点是从根节点遍历到两棵子树的最后一个公共结点。可以分别遍历后得到两个单链表,找到最后一个公共结点。用队列(两个队列从头一起pop,如果队头不同,那么之前pop的就是最低公共父节点)比用set要高效。
复杂链表的复制
http://zhedahht.blog.163.com/blog/static/254111742010819104710337/
三种方法:1,暴力法 2.用hash表,key是节点地址,value是对应复制节点的地址 3.在后面插入相同的节点(较优)
树为另一颗树的子结构
http://zhedahht.blog.163.com/blog/static/25411174201011445550396/
1.找到对应的结点
2.判断是否有一棵树的所有结点
注意:空指针和递归结束条件
顺时针输出矩阵
http://zhedahht.blog.163.com/blog/static/254111742010111112236313/
题目:求和为n的连续整数序列
例如:
15=1+2+3+4+5
15=4+5+6
15=7+8
注意:n>>1是除2的意思,除2后加1必须写成(n>>1)+1,因为n>>1+1是n>>2的意思
约瑟夫问题
number' = (number+k) mod n
- 其中number'是第k轮,number是第k+1轮,在第k+1轮
- 第一个人的编号为0,报数为1,数到k就会剔除掉
- 最后剩下的一个人一定是0号,报号为1,所以从后往前推,他的编号+死亡编号(从1数)模上人数n,推n-1次就是最终的胜利者编号(一共n个人)
寻找旋转数组最小元素
34512就是12345的一个旋转,最简单的算法能够o(n)时间内找到最小元素,但是可以用二分法,降到logn。
n个筛子的点数
有n个筛子,每种点数出现的概率是多少?总共的可能数量是6^n,每种点数出现的次数除以6^n即可。
求出每个点数出现的次数的思路:
- 两个数组:一个用来存最后结果(数组B),一个用来存六个点数出现的次数(数组A)
- 初始A为全1,B的前六位为全1,表示只有一个筛子
- 加入一个筛子,对于A数组中的第k位,其值等于k-1, k-2...k-6(当然不能小于1)位所有数值的和
- 每一次将数组A的六个值赋值到数组B的第i位到第i+5位,其中i为加入筛子的数量(循环次数)
二进制数中1出现的次数
方法一:用1不停左移再进行与运算
方法二:减1后与原数进行与运算,会使得最后一个1变成0。所以有多少个1就能进行多少次运算。
整数的n次幂
分治法;要注意对幂情况的考虑。
char * str = "abc";
cout<<sizeof(str)<<endl;会输出4而不是3
char str[10] = "abc";
cout<<sizeof(str)<<endl;会输出10而不是4
c++语法题:
输出结果是: "B::Fun with number 10",因为默认参数时在编译期确定的。
运行下列c代码会有什么结果:
GetString1 returns:后面跟的是随机的字符串
GetString2 returns:后面跟的是"Hello World"。
因为第一个是数组,在函数执行完时会自动释放空间,而第二个是常量字符串,函数结束时不会自动释放
字符组合
对于每一种情况(1个字符,2个字符,。。。,strlen个字符),每一个字母要么加入到最后的结果中,要么不加入最后的结果中。中途如果达到字符串结尾就输出,如果达到结尾了但是结果中字符的数量还没满则返回。
数组中子串最大和
在数组中,某个子串的和为最大值,输出这个最大值。
分治法: