CCI 习题笔记 1

最简单的复习方法就是我把我学过,练习过的题目都在这里写出来。CCI is for Cracking the Code Interview


1.1 检查一个string里面的字符是否唯一,如果不可以使用其他数据结构


用hashmap自然是最简单的方法,只要key存在直接跳出搜索。 由于是字符,所以可以直接使用一个数据来做。

CII 提供另外几种做法:

1.使用bit manipulation, 其实和数组没有区别,每一个字符对应'a'的位移用来设定某个值为1,存在checker里,保存方法是checker |= (1<

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.....




你可能感兴趣的:(CCI 习题笔记 1)