摘要:
2014-03-19 06:57题目:对于8x8的棋盘,如果拿掉对角位置的两个小块儿,能否用1x2的多米诺牌拼成剩下的棋盘?解法:不可能。且不说8x8,NxN都是不可能的。如果N是奇数,NxN-2是奇数,自然不可能用偶数的面积拼成。如果N为偶数,根据小学学过的染色问题,将1x2的骨牌染成1黑1白,那么最后拼成的棋盘肯定有31黑31白。问题是,摘掉的两个对角位置的颜色是一样的,所以得出矛盾,也不可能完成。代码:1 // 6.2 There is an 8x8 chessboard, if we remove the two pieces at diagonal corners, can you 阅读全文
摘要:
2014-03-19 06:40题目:有20瓶药,其中19瓶装的都是1.0克的药片,只有1瓶装了1.1克的药。给你一个能称出具体克数的电子秤,只允许你称一次,怎么找出那瓶不一样的?解法:如果药片管够,从每个瓶子里取出数量各不相同的药片,根据质量的总和减去“期望的”质量总和,就知道哪瓶有问题了。代码: 1 // 6.1 There are 20 bottles of pills, all of which have pills of 1g, except one with 1.1g. 2 // Given a balance that can provides exact measurement 阅读全文
摘要:
2014-03-19 06:33题目:用一个byte数组来模拟WxH的屏幕,每个二进制位表示一个像素。请设计一个画水平线的函数。解法:一个点一个点地画就可以了。如果要优化的话,其实可以把中间整字节的部分一口气画了,只用1/8的力气。代码: 1 // 5.8 Given a byte array, set a consecutive bit segment to '1'. 2 #include 3 #include 4 using namespace std; 5 6 typedef unsigned char byte; 7 8 inline void setBit(vecto 阅读全文
摘要:
2014-03-19 06:27题目:有一个数组里包含了0~n中除了某个整数m之外的所有整数,你要设法找出这个m。限制条件为每次你只能用O(1)的时间访问第i个元素的第j位二进制位。解法:0~n的求和有公式可循,只要把所有数都加起来就能知道缺少的m是几了。书本提供了一种比较高效的解法,我仔细读了以后觉得书上给的优化算法实际上需要额外的空间来支持,coding难度偏高,临场的话我估计挺难写出来的。代码: 1 // 5.7 Find the missing integer from 0 to n, you may only access one bit at a time. 2 #include 阅读全文
摘要:
2014-03-19 06:24题目:将一个整数的奇偶二进制位交换,(0, 1) (2, 3) ...解法:使用掩码来进行快速交换,定义掩码为'0101...'和‘1010...’。代码: 1 // 5.6 Swap odd and even bits in an integer. 2 #include 3 using namespace std; 4 5 unsigned int swapBits(unsigned int n) 6 { 7 static const unsigned int mask[2] = {0x55555555, 0xaaaaaaaa}; 8 9... 阅读全文
摘要:
2014-03-19 06:22题目:将整数A变成整数B,每次只能变一个二进制位,要变多少次呢。解法:异或,然后求‘1’的个数。代码: 1 // 5.5 Determine the number of bits required to convert integer A to B. 2 #include 3 using namespace std; 4 5 int numberOfOnes(unsigned int n) 6 { 7 int res = 0; 8 9 while (n != 0) {10 n = n & (n - 1);11 ... 阅读全文
摘要:
2014-03-19 06:15题目:解释(n & (n - 1)) == 0是什么意思?解法:n&n-1是去掉最低位‘1’的方法。根据运算符优先级,貌似用不着加那个括号,但位运算的优先级总是个模棱两可的东西,所以一般还是要加上的。去掉一个‘1’就成了0,也就是说n是2的整次幂。代码: 1 // 5.4 Show what the code "n & (n - 1) == 0" means. 2 #include 3 using namespace std; 4 5 int main() 6 { 7 unsigned int n; 8 9 while 阅读全文
摘要:
2014-03-19 05:57题目:给定一个整数N,求出比N大,而且二进制表示中和N有相同个数的‘1’的最小的数,比如3是‘11’,接下来的5是‘101’,再接下来的6是‘110’。解法:从低位往高位,首先跳过连续的‘0’,然后跳过连续的‘1’,并数数有多少个1。如果这时还没到最高位,那就从刚才跳过的‘1’中拿出1个放到这位上(当前位是‘0’),然后把剩下的‘1’填到最低的几位上去。中间填充‘0’。比如:‘100111000’的下一个是‘101000011’代码: 1 // 5.3 Find the next largest number that have same number of & 阅读全文
摘要:
2014-03-19 05:47题目:给定一个double型浮点数,输出其二进制表示,如果不能在32个字符内完成输出,则输出“ERROR”。解法:如果你熟悉IEEE754标准,应该知道double和float型的二进制位里都是什么。double型最高位是符号位,随后11位是指数位,之后52位是尾数。你可以根据尾数和指数来判断要用多少二进制位才能精确表示这个浮点数。代码不怎么好写,这种题目应该也不常考吧。代码: 1 // 5.2 Given a double, print its binary representation if can be done in 32 characters. 2 # 阅读全文
摘要:
2014-03-19 05:45题目:给定两个数M和N,将N按照二进制位,覆盖到M的特定段位中去。解法:位操作,请看代码。代码: 1 // 5.1 Insert one number into the certain bit segment of another number. 2 #include 3 using namespace std; 4 5 void printBinary(unsigned num) 6 { 7 unsigned bit = 1 >= 1;12 } while (bit);13 }14 15 unsigned insertBits(unsign... 阅读全文
摘要:
2014-03-19 05:07题目:给定一棵二叉树T和一个值value,在T中找出所有加起来和等于value的路径。路径的起点和终点都可以是树的任意节点。解法:我偷了个懒,直接把这棵树看成一个无向图,用DFS来进行暴力搜索解决问题。因为没有什么数据顺序或是范围的限制,所以搜索剪枝好像也不太容易。代码: 1 // 4.9 Find all paths in a binary tree, the path doesn't have to start or end at the root or a leaf node. 2 #include 3 #include 4 #include .. 阅读全文
摘要:
2014-03-19 05:04题目:给定两棵二叉树T1和T2,判断T2是否是T1的子树。子树的定义是,以T1的某个节点(可以是T1的根)作为根节点,得到的这棵树和T2一模一样。解法:首先可以根据节点个数省去一大部分不必要的搜索,然后再递归判断。代码还比较简单,请看下面。代码: 1 // 4.8 Check if a tree is a subtree of another. 2 #include 3 #include 4 using namespace std; 5 6 struct TreeNode { 7 int val; 8 TreeNode *l... 阅读全文
摘要:
2014-03-19 04:48题目:最近公共父节点问题。解法1:Naive算法,先对其高度,然后一层一层往上直到找到结果。代码: 1 // 4.7 Least Common Ancestor 2 // This solution is Naive Algorithm, may timeout on very large and skewed trees. 3 #include 4 #include 5 using namespace std; 6 7 const int MAXN = 10005; 8 // tree[x][0]: parent of node x 9... 阅读全文
摘要:
2014-03-19 04:16题目:找出一棵二叉搜索树中的中序遍历后继节点,每个节点都有指针指向其父节点。解法1:分两种情况:向下走时,先右后左;向上走时,先左后右。如果目标节点有右子树,就向右下走,否则往左上走。话说,如果没有父指针的话,还是一口气进行各中序遍历,求出所有结果比较有效率。代码: 1 // 4.6 Find the inorder successor of a node in the binary tree. 2 // online algorithm with parent pointer. 3 #include 4 #include 5 using name... 阅读全文
摘要:
2014-03-19 04:11题目:设计算法检查一棵二叉树是否为二叉搜索树。解法:既然是二叉搜索树,也就是说左子树所有节点都小于根,右子树所有节点都大于根。如果你真的全都检查的话,那就做了很多重复工作。只需要将左边最靠右,和右边最靠左的节点和根进行比较,然后依照这个规则递归求解即可。代码: 1 // 4.5 Check if a binary tree is binary search tree. 2 #include 3 using namespace std; 4 5 struct TreeNode { 6 int val; 7 TreeNode *left; 8 ... 阅读全文
摘要:
2014-03-19 03:40题目:给定一棵二叉树,把每一层的节点串成一个链表,最终返回一个链表数组。解法:前序遍历,遍历的同时向各个链表里添加节点。水平遍历好像还不如前序遍历来得方便。代码: 1 // 4.4 Level order traversal 2 #include 3 #include 4 using namespace std; 5 6 struct TreeNode { 7 int val; 8 TreeNode *left; 9 TreeNode *right; 10 11 TreeNode(int _val... 阅读全文
摘要:
2014-03-19 03:34题目:给定一个排好序的数组,设计算法将其转换为一棵二叉搜索树,要求树的高度最小。解法:递归生成平衡二叉树,使左右子树的节点数尽量相等,所以对半开最好了。其实也可以生成一棵完全二叉树,不过写法应该不是很方便。代码: 1 // 4.3 Convert sorted unique array to height-balanced binary search tree. 2 #include 3 using namespace std; 4 5 struct TreeNode { 6 int val; 7 TreeNode *left; 8 ... 阅读全文
摘要:
2014-03-19 03:32题目:给定一个有向图,判断其中两点是否联通。解法:DFS搜索解决,如果是无向图的话,就可以用并查集高效解决问题了。代码: 1 // 4.2 Write a program to check if there exists a path between two nodes in a directed graph. 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 9 struct GraphNode { 10 int... 阅读全文
摘要:
2014-03-19 03:30题目:判断一个二叉树是否为平衡二叉树,即左右子树高度相差不超过1。解法:递归算高度并判断即可。代码: 1 // 4.1 Implement an algorithm to check if a bianry tree is height-balanced. 2 #include 3 #include 4 #include 5 using namespace std; 6 7 struct TreeNode { 8 int val; 9 TreeNode *left;10 TreeNode *right;11 12 ... 阅读全文
摘要:
2014-03-19 03:20题目:实现一个包含阿猫阿狗的先入先出队列,我要猫就给我一只来的最早的猫,要狗就给我一只来的最早的狗,随便要就给我一只来的最早的宠物。建议用链表实现。解法:单链表可以实现一个简单的队列,这种有不同种类数据的队列,可以用if语句选择,也可以用一个堆做时间上的优化。对于来的时间,我用一个64位整数表示时间戳,在地球被太阳吃掉以前,这个数字是不大可能上溢的,所以问题应该不大。代码: 1 // 3.7 Implement a queue that holds cats and dogs. If you want dog or cat, you get the oldes. 阅读全文