摘要:
2014-03-20 04:15题目:你有n个盒子,用这n个盒子堆成一个塔,要求下面的盒子必须在长宽高上都严格大于上面的。如果你不能旋转盒子变换长宽高,这座塔最高能堆多高?解法:首先将n个盒子按照长宽高顺序排好序,然后动态规划,我写了个O(n^2)时间复杂度的代码。代码: 1 // 9.10 A stack of n boxes is form a tower. where every stack must be strictly larger than the one right above it. 2 // The boxes cannot be rotated. 3 #include . 阅读全文
摘要:
2014-03-20 04:08题目:八皇后问题。解法:DFS解决。代码: 1 // 9.9 Eight-Queen Problem, need I say more? 2 #include 3 #include 4 using namespace std; 5 6 class Solutio... 阅读全文
摘要:
2014-03-20 04:04题目:给你不限量的1分钱、5分钱、10分钱、25分钱硬币,凑成n分钱总共有多少种方法?解法:理论上来说应该是有排列组合的公式解的,但推导起来太麻烦而且换个数据就又得重推了,所以我还是用动态规划解决。代码: 1 // 9.8 Given unlimited quarters(25 cents), dimes(10 cents), nickels(5 cents) and pennies(1 cent), how many ways are there to represent n cents. 2 #include 3 #include 4 using nam.. 阅读全文
摘要:
2014-03-20 03:35题目:实现画图的Flood Fill操作。解法:DFS和BFS皆可,但BFS使用的队列在时间复杂度上常数项比较大,速度略慢,所以我选了DFS。当然,如果图很大的话DFS是会导致call stack溢出的,那就摊上事儿了。代码: 1 // 9.7 Implement a flood fill painter that changes a certain area to a certain color. You are given one point as the seed. 2 #include 3 #include 4 using namespace std.. 阅读全文
摘要:
2014-03-20 03:27题目:输出所有由N对括号组成的合法的括号序列。比如n=2,“()()”、“(())”等等。解法:动态规划配合DFS,应该也叫记忆化搜索吧。一个整数N总可以拆成若干个正整数的和,执行搜索的时候也是按照这个规则,将N序列拆成多个子序列进行搜索,同时将中间的搜索结果记录下来,以便下次再搜到的时候直接调用,省掉重复计算的开销。代码: 1 // 9.6 Print all valid parentheses sequences of n ()s. 2 #include 3 #include 4 #include 5 using namespace std; 6 7... 阅读全文
摘要:
2014-03-20 03:23题目:给定一个字符串,输出其全排列。解法:可以调用STL提供的next_permutation(),也可以自己写一个。对于这种看起来简单的题目,应该在能优化的地方,尽量想办法优化。在面试里如果大家都会做的题,你就得做的很好才能拉开差距,否则就等着thank you了。代码: 1 // 9.5 Print all permutations of a string. 2 #include 3 #include 4 #include 5 using namespace std; 6 7 void countingSort(char s[], int n) 8 ... 阅读全文
摘要:
2014-03-20 03:08题目:给定一个集合,返回其幂集。解法:DFS。代码: 1 // 9.4 Return all subsets of a set 2 #include 3 #include 4 using namespace std; 5 6 void getSubsets(const vector &v, int idx, vector &buffer, vector > &res) 7 { 8 if (idx == (int)v.size()) { 9 res.push_back(buffer);10 } else {11 ... 阅读全文
摘要:
2014-03-20 03:01题目:给定一个已按升序排序的数组,找出是否有A[i] = i的情况出现。解法1:如果元素不重复,是可以严格二分查找的。代码: 1 // 9.3 Given a unique sorted array, find a position where A[i] = i, if one exists. 2 #include 3 #include 4 using namespace std; 5 6 int main() 7 { 8 vector v; 9 int n;10 int i;11 int ll, rr, mm;12 ... 阅读全文
摘要:
2014-03-20 02:55题目:从(0, 0)走到(x, y),其中x、y都是非负整数。每次只能向x或y轴的正方向走一格,那么总共有多少种走法。如果有些地方被障碍挡住不能走呢?解法1:如果没有障碍的话,组合数学,排列组合公式C(x + y, x)。代码: 1 // 9.2 How many ways are there to go from (0, 0) to (x, y), if you only go left or up, and one unit at a time? 2 #include 3 using namespace std; 4 5 int combination(.. 阅读全文
摘要:
2014-03-20 02:55题目:小朋友跳台阶,每次跳1层或2层,那么跳N层总共有多少种跳法。解法:斐波那契数列。代码: 1 // 9.1 A child can run up the stair with n staircases. Every time he can hop up by 1, 2 or 3 steps. How many possible way to do this are there? 2 #include 3 #include 4 using namespace std; 5 6 int main() 7 { 8 int n; 9 int i... 阅读全文
摘要:
2014-03-20 02:29题目:将质因数只有3, 5, 7的正整数从小到大排列,找出其中第K个。解法:用三个iterator指向3, 5, 7,每次将对应位置的数分别乘以3, 5, 7,取三者中最小的数作为生成的下一个结果。可以一次性生成整个序列,因为这个序列一般不会很长,增长率是指数级的。代码: 1 // 7.7 Find the kth number that has no prime factors other than 3, 5 or 7. 2 #include 3 #include 4 #include 5 using namespace std; 6 7 int ma... 阅读全文
摘要:
2014-03-20 02:24题目:给定二位平面上一堆点,找到一条直线,使其穿过的点数量最多。解法:我的解法只能适用整点,对于实数坐标就得换效率更低的办法了。请参见LeetCode -Max Points on a Line-zhuli19901106- 博客园。代码: 1 // 7.6 Find the line that crosses the most points. 2 #include 3 #include 4 using namespace std; 5 6 struct Point { 7 int x; 8 int y; 9 Po... 阅读全文
摘要:
2014-03-20 02:20题目:给定二维平面上两个正方形,用一条直线将俩方块划分成面积相等的两部分。解法:穿过对称中心的线会将面积等分,所以连接两个中心即可。如果两个中心恰好重合,那么任意穿过这个点的直线都满足条件。代码:1 // 7.5 Given two squares on two-dimensional plane, draw a line to cut them in two parts with equal area.2 // Answer:3 // Apparently the line should go through the center of the two ... 阅读全文
摘要:
2014-03-20 02:16题目:只用加法和赋值,实现减法、乘法、除法。解法:我只实现了整数范围内的。减法就是加上相反数。乘法就是连着加上很多个。除法就是减到不能减为止,数数总共减了多少个。代码: 1 // 7.4 Implement the -*/ function with only the + operator. 2 // You cannot use bit operation, although you might want it for efficiency. 3 #include 4 using namespace std; 5 6 int negate(in... 阅读全文
摘要:
2014-03-20 02:05题目:给定笛卡尔二维平面上两条直线,判断它们是否相交。解法:相交、重合、平行。代码: 1 // 7.3 Given two lines on the Cartesian, determine if they would intersect. 2 #include 3 using namespace std; 4 5 int main() 6 { 7 // a * x + b * y + c = 0; 8 // d * x + e * y + f = 0; 9 int a, b, c, d, e, f;10 bool suc;1... 阅读全文
摘要:
2014-03-20 01:59题目:有n只蚂蚁在正n边形的n个顶点,同时以同速率开始沿着边走。每只蚂蚁走的方向是随机的,那么这些蚂蚁至少有两只发生碰撞的概率是多少。解法:只有所有蚂蚁都往一个方向走才不会碰撞,所以不碰的概率就是2/2^n,碰的概率就用1减去喽。代码:1 // 7.2 n ants are standing on the vertices of an n-edged equilateral polygon, they start walking at the same time, same speed.2 // Every ant chooses randomly a dire 阅读全文
摘要:
2014-03-20 01:57题目:玩篮球投篮,有两种玩法:要么1投1中,要么3投两中。你单次投篮中的概率是p,那么对于不同的p,哪种玩法胜率更高?解法:第一种总是胜率更高,可以列不等式算算,结果发现是个恒不等式。代码: 1 // 7.1 Suppose you're playing a basketball game, you have two choices: 2 // A: one shot one hit 3 // B: three shots two hits 4 // For what probability of p would you choose A or B. 5 阅读全文
摘要:
2014-03-20 01:14题目:有100栈灯,一开始都关着。如果你按照n从1~100的顺序,每次都掰一下n的倍数的开关(开->关,关->开),那么到最后有多少灯是亮的?解法:这个题目要多想想再动手,因为想通了以后就基本不用动手了。对于编号为x的灯,每当i是x的约数时,在第i轮时第x号灯就被掰了一次。比如6的约数为{1,2,3,6},6号灯被掰了4次。那么,每个灯被掰的次数就是约数个数次。约数个数的公式你懂的,但是用不着去算。如果一盏灯是开的,那么它就被掰了奇数次,根据约数和公式,只有因数分解之后所有指数都是偶数的时候,约数个数才为奇数。比如36的约数{1,2,3,4,6,9, 阅读全文
摘要:
2014-03-20 01:08题目:扔鸡蛋问题。有一个鸡蛋,如果从N楼扔下去恰好会摔碎,低于N楼则不碎,可以继续扔。给你两个这样的鸡蛋,要求你一定得求出N,怎么扔才能减少最坏情况下的扔的次数?解法:为了让worst case得到最优化,就需要让best case和worst case最接近。具体做法请参见书上题解,因为我一直在想着二分,实在是摸不着头脑。代码: 1 // 6.5 Given 100 floors and 2 eggs. 2 // If the egg can sustain a dropping from nth floor, and will break for highe 阅读全文
摘要:
2014-03-20 01:02题目:无力描述的一道智力题,真是货真价实的智力题,让我充分怀疑自己智力的智力题。有兴趣的还是看书去吧。解法:能把题目看懂,你就完成80%了,用反证法吧。代码: 1 // 6.4 There is an island with a bunch of people living there. 2 // The strange thing is, any blue-eyed tourists must leave immediately when they find out they're blue-eyed. 3 // Everyone can see ot 阅读全文