最简单的复习方法就是我把我学过,练习过的题目都在这里写出来。CCI is for Cracking the Code Interview
1.1 检查一个string里面的字符是否唯一,如果不可以使用其他数据结构
用hashmap自然是最简单的方法,只要key存在直接跳出搜索。 由于是字符,所以可以直接使用一个数据来做。
CII 提供另外几种做法:
1.使用bit manipulation, 其实和数组没有区别,每一个字符对应'a'的位移用来设定某个值为1,存在checker里,保存方法是checker |= (1<<val).之后对于新的数字,对比checker & (1<<val) 就可以了。
2. Sort之后线性检测重复字符。但是注意必须是in-place的sort
这题主要是memory的限制。
1.2 字符串反序
两个指针,线性交换。其实C++可以之间用一个string初始化另外一个string。所以string(a.rbegin(),a.rend());应该是practical的做法,虽然内部算法也差不多。
1.3检查一个string是不是另外一个的permutation
permutation这类题目有点多的。比如说如何permutate一个array,并不容易理解我觉得(尤其是不能考虑完备性,比较适合用subproblem的方式解决)。扯远了
1. sort,似乎所有乱序的问题都可以用sort来解决,方便快捷
2. hashmap,在这个问题上数组就可以了。数组和hashmap是一回事,数组只是hash function简单的hashmap。
sort的方法加上线性比较,是O(nlogn),hashmap的话,必须是O(n)了,所以似乎后者快一点儿,这个也好理解,毕竟有一些不必要的比较操作。
1.4 把空格置换成一个字符串。
这题没啥难度,置换能有啥难度,关键是事先扫描一遍有多少空格。然后可以知道把最后一个单词移动到哪里,然后从尾巴开始移动。
1.5 压缩一个字符串 aaa=>a3
这题每次看都有点无聊我决定不看了,基本的意思就是说string catenation很慢,所以用了一个java的trick,我觉得C++里面似乎没有这个东西。另外,线性扫描,一次就可以搞定计数的问题,很简单:if(char[i]!=last) last=char[i] else count++
1.6 rotate一个N by N的数组90度
这题需要仔细分析,本质上是个数学问题,只不过是如何各种切开分层而已,这题要是面试考了再说吧,和quantcast千年不变的初试题差不多。
1.7 把一个矩阵里面只要是有0的element,row和column都设置成0
这题非常有实际意义--因为我做研究的时候在做correlation matrix的时候写过类似的。陷阱在于你不能挨个删,不然就删没了。
所以就用两个数组把应该删除的记录下来。没了。。。
现实总是用不了太复杂的玩意,我是这么感觉的
1.8 检查一个string s1是不是另外一个 string s2的rotation,给你一个isSubstring()的方法
非常简单,但是第一次打死也不容易想到。。。就是检查s1+s2里面是不是有s1.....