LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0。
题目30:旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。n<=1000000, 数组中每个元素值不超过10000000。输出旋转数组中最小的元素。
题目2:常规题,前序的第1个输出的为根结点,在中序中查找到该结点,在该结点前面的为左子树,后边的为右子树,递归重建左子树和右子树。在递归过程中,如果某一步前序的根结点在中序中没有出现,则不能重建。
题目4-7:递推,题目4、5、7递推式其实都是斐波那契数列,f(n)=f(n-1)+f(n-2),只是初值不同。题目6递推式为f(n)=f(n-1)+f(n-2)+...f(0)。由于n不大,可以用64位无符号数存放。如果n变得很大,可以将求解递推式转化为矩阵的n次方,用二分法进行求解,时间复杂度为O(logn)。
题目9:用一个栈作辅助,顺序描述压入序列和弹出序列,如果当前位置上压入序列和弹出序列值相等,直接都向后移一个元素;比较栈顶元素和弹出序列当前值,如果相等,出栈,弹出序列后移一个元素;其余情况,将压入序列当前值压栈,压入序列后移一个元素。如果到最后,弹出序列都处理不完,说明弹出序列不合法。时间复杂度为O(n)。
代码:http://www.oschina.net/code/snippet_203297_11241
题目10:二叉搜索树的性质之一为:根结点值大于左子树,小于右子树。设后序遍历顺序为 A B C,则有A<C<B。因此,从根结点(遍历的最后一个结点)出发,向前找到所有连续的大于根结点的值作为右子树,再往前的所有连续小于根结点的作为左子树,如果往前还有大于根结点的,则不是二叉搜索树的后序遍历结果。递归处理左子树和右子树。时间复杂度约为O(nlogn)。
代码:http://www.oschina.net/code/snippet_203297_11241
题目11:遍历二叉树,累加结果即可。结果可能超出int,需要用long long。
题目12:全排列生成,回溯或调用STL的next_permutation
题目13:将出现一半的数与其他数两两抵消,剩余的最后一个数即是答案。具体做法是每次选两个不同的数两两抵消,要么会抵消一个答案数字和一个非答案数字,要么抵消两个非答案数字,到最后剩余的一定是答案。时间复杂度为O(n)。
代码:http://www.oschina.net/code/snippet_203297_11241
题目14:堆排序,nlog(K);patial_sort;先找最K大的,O(n),再取出前K大的排序,O(KlogK)。题目极容易超时,原因在于输入输出耗费了很大一部分时间,用gets读一行,然后手动获取数据代替n次scanf可以通过。
题目15:动态规划,时间复杂度O(n)。
题目16:按位统计,统计每位上1出现的次数。当前位刚好是1和刚好是0需要单独考虑。
代码:http://www.oschina.net/code/snippet_203297_11241
题目17:哈希,用100大小的数组直接统计,O(n)。
题目18:构造。用2,3,5构造出所有整型数范围内的丑数,排序即可。
题目19:扫描一遍字符串,统计每个字符出现的次数即可。
题目20:归并排序,在merge的时候统计逆序对,设需要merge的数组为A,B,A大小为n,B大小为m。如果A[i]>B[j],则逆序数将增加n-i。
代码:http://www.oschina.net/code/snippet_203297_11241
题目23:设两个数字为A和B,将所有数字异或,其他出现偶数次的数字均被消去,结果是A^B,找到结果中某位为1的位,表示该位上A和B是不同的,扫描一遍所有数字,用该位将所有数字分成两部分,单个部分异或即得到A和B的值。
参考代码:http://www.oschina.net/code/snippet_203297_10737
题目24:用两个游标,一个从头开始A[i],一个从尾开始A[j],如果A[i]+A[j]<S,则i后移一格,否则j前移一格,如果相等,则记录结果。算法复杂度为O(n)。
代码:http://www.oschina.net/code/snippet_203297_11241
题目25:由于序列是等差数列,有S=an+n(n-1)/2,其中a为序列第一个元素,n为个数。枚举n,一直到sqrt(2S),查看是否有整数解即可。复杂度为O(sqrt(S))。
题目28:递推,令f[i][j]表示前i个骰子,点数和为j的次数。有f[i][j] = f[i-1][j-1]+....+f[i-1][j-m]。也可直接用一维的轮换数组进行计算,即g[j] = f[j-1]+...+f[j-m], f=g。
代码:http://www.oschina.net/code/snippet_203297_11241