游戏之乐
摘要:扑克牌的顺子从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看出任意数字。(出自:剑指offer)最直观的方法是把数组排序,(把大小王看成0)由于0可以当成任意数字,我们可以用0去补满数组中的空缺,如果排序之后的数组不是连续的,即相邻的两个数字相隔若干个数字,但只要我们有足够的0可以补满这两个数字的空缺,这个数组实际上还是连续的。于是我们需要做3件事情:首先把数组排序,再统计数组中0的个数,最后统计排序后的数组中相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之则不
阅读全文
posted @
2013-07-05 18:13
Lee_Alvin
阅读(184)
推荐(0)
数字之魅
摘要:和为S的两个数字输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得他们的和正好是s,如果有多对数字的和等于s,输出任意一对即可。先在数组中选择两个数字,如果他们的和等于输入的s,我们就找到了要找的两个数字,如果和小于s,我们希望两个数字的和再大一点。由于数组已经排好序了,我们可以选择较小的数字后面的数字。同样,当两个数字的和大于输入的数字的时候,我们可以选择较大数字前面的数字,因为排在数组前面的数字要小一些。#include bool FindNumberOfSum( int *data, int length, int sum, int &data1, int &d
阅读全文
posted @
2013-07-04 16:18
Lee_Alvin
阅读(179)
推荐(0)
二进制和位运算
摘要:数组中只出现一次的数字一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字,要求时间复杂度是O(n),空间复杂度是O(1)。任何一个数字异或它自己都是0。如果我们从头到尾异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些成对出现两次的数字全部在异或中抵消了。#include unsigned int FindFirstBitIs1( int num ){ int indexBit = 0; while ( ( ( num & 1 ) == 0 ) && ( indexBit > 1; indexBit+
阅读全文
posted @
2013-07-04 15:47
Lee_Alvin
阅读(501)
推荐(0)
二叉树
摘要:二叉树的深度struct BinaryTreeNode{ int m_value; BinaryTreeNode *m_left; BinaryTreeNode *m_right;};输入一颗二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。(出自:剑指offer)如果一棵树只有一个结点,它的深度为1。如果根节点只有左子树而没有右子树,那么树的深度应该是左子树的深度加1;同样如果根节点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加1.如果既有右子树又有左子树,那么该树的深度是其左右子树深度的较...
阅读全文
posted @
2013-07-03 17:10
Lee_Alvin
阅读(188)
推荐(0)
二分查找
摘要:数字在排序数组中出现的次数统计一个数字在排序数组中出现的次数,例如输入排序数组{0, 1, 2, 3, 4, 4, 4, 4, 5}和数字4,由于4在这个数组中出现了4次,因此输出4。(出自:剑指offer)既然输入的数组是排序的,那么很自然地就能想到用二分查找算法。 1 #include 2 3 int getFirstK( int *data, int length, int k, int start, int end ) 4 { 5 if ( start > end ) 6 { 7 return -1; 8 } 9 int midInd...
阅读全文
posted @
2013-07-03 16:10
Lee_Alvin
阅读(113)
推荐(0)