CareerCup专栏
文章平均质量分 73
和网友分享Crack the Coding Interview一书中的解法
chiiis
这个作者很懒,什么都没留下…
展开
-
Recursion 爬楼梯问题 @CareerCup
开始CareerCup一书的刷题。。先从recursion这一章开始!我的解法:package Recursion;/** * A child is running up a staircase with n steps, and can hop either 1 step, 2 * steps, or 3 steps at a time. Implement a meth原创 2013-11-26 09:16:09 · 1981 阅读 · 2 评论 -
Recursion 二维空间里机器人向右或向下走的所有路径问题 @CareerCup
这道题学到了在做回溯时,先把点加入到path中,然后根据子情况来决定success这个变量,从而决定之前加入的点是否有必要的。如果子情况返回的是false,则这个点也没有必要加入到path中,就可以移除了。还有一个是,我的解答中每次函数只对当前点进行isFree的判断,官方答案中却对下一个节点进行判断。我还是觉得我的更直观一些。package Recursion;import原创 2013-11-26 14:17:18 · 1797 阅读 · 0 评论 -
Recursion 在数组中寻找神奇下标 @CareerCup
当数组里的元素没有重复时,因为数组已经是排序好的了,自然想到用二分法。如果数组里的元素有重复时,magic index可能出现在左侧也可能出现在右侧,这个画图举个例子就知道了。可以优化的是,无论是在左侧还是右侧,总有一些元素可以直接排除,从而缩短查找时间!package Recursion;import java.util.Arrays;import CtCILibra原创 2013-11-27 01:01:09 · 1889 阅读 · 0 评论 -
Recursion 求所有子集 @CareerCup
这道题可以用递归和迭代两种方法来做。先说一下有收获的地方:在递归中,更经常的采用的是头递归,即调用先递归处理子问题,然后基于子问题的解再处理当前问题!并且这样还能减少stack中保存的内容。当然如果是比较简单的递归,即当前问题不依赖于子问题的解,如前面的那道findMagicIndex问题,就可以用尾递归。还有一点是,因为我在递归中ret值是不断往下传递的,所以原创 2013-11-27 01:53:30 · 2202 阅读 · 1 评论 -
Recursion 字符串的全排列 String Permutation @CareerCup
字符串全排列的题目,还是套用模板,同样要注意ret的size问题会变化。而且与上一题不同的是不光是要在ret后面添加进新的组合,而且还要移除前面用过的组合。类似一个队列。另外Java的substring中区间闭合情况是左闭右开 [ ) 所以想把一个字符串拆成两个区间就可以用这一句:for(int j=0; j<=tmp.length(); j++){ // substring原创 2013-11-27 05:03:11 · 2841 阅读 · 0 评论 -
Recursion n对括号的组合 @CareerCup
看不太习惯书上写的递归,觉得没有自己写的清晰。这道题唯一要满足的条件就是在任何时候,左括号数量一定要大等于右括号的数量。package Recursion;import java.util.HashSet;import java.util.Set;/** *Implement an algorithm to print all valid (e.g., properly原创 2013-11-27 05:20:32 · 1647 阅读 · 0 评论 -
Recursion 图像软件中的“填充”函数 @CareerCup
搞清楚题意后就很简单了,用DFS暴搜即可package Recursion;/** * 原文:Implement the “paint fill” function that one might see on many image editing programs. That is, given a screen (represented by a 2-dimensiona原创 2013-11-27 05:44:18 · 1981 阅读 · 0 评论 -
Recursion 硬币组合问题 @CareerCup
非常有意义的一道题,关键的一点要知道DFS是有顺序的,即在DFS中(5,1)和(1,5)是不一样的组合。所以对这道题我的第一种解法就重复算了多次,具体如图所示:当计算f(10)时,DFS给出的结果是9次,但实际上应该是4.去重的方法是多用一个变量(level)来限制条件。这样能保证在访问对于给定level只会深搜小于等于level的分支。同样参考了http://hawstein.c原创 2013-11-27 09:15:25 · 2256 阅读 · 0 评论 -
Recursion 八皇后问题 @CareerCup
递归+回溯,不多说了。唯一要注意的是在每次记录一个可行的方案时,要复制一份数组,在Java中可以通过1 循环复制2 clone() 方法3 System.arraycopy() 方法这里按照书上,用了clone()方法!package Recursion;import java.util.ArrayList;/** * Write an algorithm t原创 2013-11-27 10:18:16 · 1265 阅读 · 0 评论 -
Recursion 叠箱子最高问题 @CareerCup
这类问题要多多画图package Recursion;import java.util.ArrayList;import java.util.HashMap;/** * You have a stack of n boxes, with widths wi, heights hi and depths di The * boxes cannot be rotated an原创 2013-11-27 11:40:41 · 2083 阅读 · 0 评论 -
Recursion 计算表达式的括号组合 @CareerCup
还没细看,先把代码放在这里package Recursion;import java.util.HashMap;/** * Given a boolean expression consisting of the symbols 0,1, &, /, and ^ , and a * desired boolean result value result, implement原创 2013-11-27 12:09:28 · 1548 阅读 · 0 评论 -
Soring&Searching 合并两个有序数组 @CareerCup
merge,要点是从后往前走package Sorting_Searching;import CtCILibrary.AssortedMethods;/** * You are given two sorted arrays, A and B, and A has a large enough buffer at * the end to hold B. Write a m原创 2013-11-29 13:50:17 · 1240 阅读 · 0 评论 -
Sorting&Searching 基于变位词的字符串数组排序 @CareerCup
两种排序结果不一样。。。1 实现Comparator接口的compare方法,在里面先把每个string都排序一遍,然后再比较2 用一个Hashtable>的结构,String为排序后的确定的string,LL里面装着各种anagram的变种package Sorting_Searching;import java.util.Arrays;import java.util原创 2013-11-29 14:09:43 · 2045 阅读 · 0 评论 -
Sorting&Searching 旋转数组二分法查找 @CareerCup
就是3种情况,写在注释里了package Sorting_Searching;/** * Given a sorted array of n integers that has been rotated an unknown number of * times, give an O(log n) algorithm that finds an element in the ar原创 2013-11-29 14:30:19 · 1317 阅读 · 0 评论 -
Sorting&Searching 二分法找有空字符串的数组 @CareerCup
要点是找到最近的不是空字符串的位置,然后作为mid,再继续二分package Sorting_Searching;/** * Given a sorted array of strings which is interspersed with empty strings, * write a method to find the location of a given stri原创 2013-11-29 14:58:56 · 1397 阅读 · 0 评论 -
Sorting_Searching 有序矩阵中查找数 @CareerCup
要点就是从右上角或者左下角开始找,每次比较能排除一行或者一列package Sorting_Searching;import CtCILibrary.AssortedMethods;/** * *Given a matrix in which each row and each column is sorted, write a method to find an原创 2013-11-30 02:20:37 · 1594 阅读 · 0 评论 -
Sorting_Searching 叠罗汉 @CareerCup
类似前面的一道堆箱子普适的解法是回溯,注意这类是求最值的回溯题。另一种解法是LIS,先把其中一维排序,然后对剩下的一维进行LISpackage Sorting_Searching;import java.util.ArrayList;import java.util.Collections;/** * A circus is designing a tower r原创 2013-11-30 04:36:20 · 2323 阅读 · 0 评论 -
Sorting_Searching 读入数字流求rank @CareerCup
用BST实现package Sorting_Searching;import CtCILibrary.AssortedMethods;/** * Imagine you are reading in a stream of integers. Periodically, you wish to be * able to look up the rank of a n原创 2013-12-02 06:17:40 · 2293 阅读 · 0 评论 -
Moderate Swap不用临时变量 @CareerCup
经典Swap问题,注意用异或时,不同让两个参数指向同一个变量!package Moderate;/** * * Write a function to swap a number in place without temporary variables. * * 译文: * * 写一个函数交换两个数,不能使用临时变量。 */public class Moder原创 2013-12-02 06:27:40 · 1306 阅读 · 0 评论 -
Moderate 判断井字游戏的胜利 @CareerCup
基于要查找的次数来决定是否要预处理。预处理方式按照3进制来做。另外,检查是否赢了要判断横行,纵列,正反对角线package Moderate;/** * Design an algorithm to figure out if someone has won in a game of tic-tac-toe.译文:设计算法检查某人是否赢得了井字游戏。 *原创 2013-12-02 07:12:59 · 2845 阅读 · 0 评论 -
Moderate 阶层的结尾0个数 @CareerCup
思路和《经典面试题:100的阶乘有几个结尾零》是一样的,但代码更简洁了,尤其是第二种方法!package Moderate;/** * Write an algorithm which computes the number of trailing zeros in n * factorial. * * 译文: * * 写一个算法计算n的阶乘末尾0的个数。 *原创 2013-12-02 07:30:12 · 1572 阅读 · 0 评论 -
Moderate 不用比较符返回较大的数 @CareerCup
通过判断a-b的最高位来知道哪一个数比较大但是要注意overflow的情况if a and b have different signs: // if a > 0, then b < <d, and k = l. // if a 0, and k = 0. // so either way, k = sign(a) let k = sign(a)else let k原创 2013-12-02 07:57:03 · 1589 阅读 · 0 评论 -
Moderate 猜测序列hit或是pseudo-hit @CareerCup
思路不难,关键是如何写出结构清晰的代码,另外注意到的就是用到的frequencies数组来使得复杂度由暴力的O(n2)到O(n)package Moderate;import java.util.Random;/** * The Game of Master Mind is played as follows:The computer has four slot原创 2013-12-02 08:24:05 · 1524 阅读 · 0 评论 -
Moderate 找最小排序区间 @CareerCup
例子:数组 1, 2, 4, 7, 10, 11, 7, 12, 6, 7, 16, 18, 19 只要对下标3到9之间的元素排序,就能使整个数组有序思路是:// Left: 1, 2, 4, 7, 10, 11// Middle: 7, 12// Right: 6, 7, 16, 18, 191 找到左边递增序列的最右(最大)的那个元素 112 找到右边递增序列最左(最原创 2013-12-03 01:55:04 · 1483 阅读 · 0 评论 -
Moderate 整数打印读法 @CareerCup
比较繁琐,要处理的case很多package Moderate;import CtCILibrary.AssortedMethods;/** * Given any integer, print an English phrase that describes the integer (e.g., "OneThousand, Two Hundre原创 2013-12-03 02:16:05 · 1578 阅读 · 0 评论 -
Moderate 最大连续序列之和 @CareerCup
最大连续序列之和问题,思路就是保持两个变量,一个记录到当前位置最大的和(maxSum),还有一个记录当前位置的和(curSum)当curSum+a[i]如果>=0时,curSum += a[i]package Moderate;/** * * You are given an array of integers (both positive and negative).原创 2013-12-03 02:38:26 · 1319 阅读 · 0 评论 -
Moderate 查单词 @CareerCup
简单题,如果是只查询一次,则用时O(n)如果要多次查询,则用一个Hashtable存储已查过的词package Moderate;import java.util.Hashtable;import CtCILibrary.AssortedMethods;/** * Design a method to find the frequency of occurrences原创 2013-12-03 02:57:16 · 1854 阅读 · 0 评论 -
Moderate rand5()产生rand7() @CareerCup
参考这一文 http://hawstein.com/posts/19.10.html比书上写得好package Moderate;/** * * Write a method to generate a random number between 1 and 7, given a method that generates a random number betwe原创 2013-12-04 00:33:06 · 2262 阅读 · 0 评论 -
Moderate 找到数组中和为定值的整数对 @CareerCup
1 如果用Hashtable,能取得时间复杂度O(n)2 如果用前后指针来做,时间复杂度为O(nlogn) 因为要排序package Moderate;import java.util.Arrays;/** * Design an algorithm to find all pairs of integers within an array which sum t原创 2013-12-04 00:50:34 · 1747 阅读 · 0 评论 -
Moderate BST转双向链表 @CareerCup
书中提到了3种方法:1 新建一个数据结构NodePair用于保存一个双向链表的头尾节点2 不用NodePair,只用记录双向链表的头结点,尾节点可以遍历得到3 形成一个循环链表,这样能更快地找到尾节点package Moderate;/** * Consider a simple node-like data structure called BiNode原创 2013-12-04 01:40:44 · 2199 阅读 · 0 评论 -
Moderate 加入空格使得可辨别单词数量最多 @CareerCup
递归题目,注意结合了memo的方法和trie的应用package Moderate;import java.util.Hashtable;import CtCILibrary.AssortedMethods;import CtCILibrary.Trie;/** * Oh, no! You have just completed a lengthy docume原创 2013-12-13 01:24:54 · 2174 阅读 · 0 评论 -
Hard 不用+号实现两个数之和 @CareerCup
例子:759+6741)不考虑进位: 3232)只考虑进位:11103)两者之和:1433 递归求解cpackage Hard;/** * Write a function that adds two numbers. You should not use + or any arithmetic operators.译文:写一个Add函数求两个数的和,原创 2013-12-13 02:00:39 · 1804 阅读 · 0 评论 -
Hard 随机洗牌函数 @CareerCup
第i个元素和index在[0,i]之间的一个数随机交换package Hard;import CtCILibrary.AssortedMethods;/** * * Write a method to shuffle a deck of cards. It must be a perfect shuffle - in other words, each 52! permu原创 2013-12-13 02:23:33 · 2333 阅读 · 0 评论 -
Hard 随机选择subset @CareerCup
算法同上题package Hard;import CtCILibrary.AssortedMethods;/** * Write a method to randomly generate a set of m integers from an array of size n. Each element must have equal probability of bein原创 2013-12-13 02:47:31 · 1796 阅读 · 0 评论 -
Hard 计算0到n之间2的个数 @CareerCup
一种是Brute force,O(nlogn)另一种是找规律O(n),见http://hawstein.com/posts/20.4.html当某一位的数字小于2时,那么该位出现2的次数为:更高位数字x当前位数当某一位的数字大于2时,那么该位出现2的次数为:(更高位数字+1)x当前位数当某一位的数字等于2时,那么该位出现2的次数为:更高位数字x当前位数+低位数字+1原创 2013-12-13 03:33:29 · 1613 阅读 · 0 评论 -
Hard 大文本找两个单词最短距离 @CareerCup
如果只要找一次就用第一种O(n)解法如果要找多次就多用一个Hashtable,把所有的组合都保存起来package Hard;import java.util.HashMap;import java.util.HashSet;import java.util.Map;import CtCILibrary.AssortedMethods;/** * You原创 2013-12-13 04:43:49 · 2259 阅读 · 0 评论 -
Hard 找最小的k个数(Selection Rank) @CareerCup
1 排序 O(nlogn)2 建最大堆,插入新元素的同时,不断删除最大元素O(nlogk)3 Selection Rank 算法,注意partition方法,极其容易写错!我会另外写一篇专门讲这个算法!package Hard;import java.util.Arrays;import CtCILibrary.AssortedMethods;/** * Desc原创 2013-12-13 06:34:53 · 1837 阅读 · 0 评论 -
Hard 找到由其它单词组成的最长单词 @CareerCup
用DFS的那个模板就能做出来,值得注意的是一个词必须被除自己外的其他词组成才行,不能是自己组成自己。package Hard;import java.util.ArrayList;import java.util.Arrays;import java.util.Comparator;import java.util.HashMap;import CtCILibrary.A原创 2013-12-13 10:01:25 · 3543 阅读 · 0 评论 -
Hard 在字符串S中查找T中的字符串 @CareerCup
后缀树!!package Hard;import java.util.ArrayList;import java.util.HashMap;/** * Given a string s and an array of smaller strings T, design a method to search s for each small string in T.译文原创 2013-12-13 11:58:15 · 1894 阅读 · 0 评论 -
Hard 动态查找中位数 @CareerCup
用大小堆实现插入O(logn),查询O(1)的算法,注意invariant是大堆的size一定是与小堆相等或者比小堆大一。另外大堆存放所有小等于中位数的值,小堆存放所有大于中位数的值。package Hard;import java.util.Arrays;import java.util.Comparator;import java.util.PriorityQueue;原创 2013-12-13 13:02:47 · 1934 阅读 · 0 评论