最近开始研究《Cracking the Coding Interview》一书,其实就是美版的IT面试宝典。但是细细品读下来,感觉其质量要优于国内的许多同类书籍。言简意赅,不拖泥带水,作者希望引导读者如果循序渐进思考、提高个人技能。
有感于自己之前实习面试的挫折经历,发现对很多知识点理解都很浅,借此机会夯实下基础,以便迎接之后找工作大业......
Question1. Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structure?
本题应该是非常简单的,关键能否想到巧借字符的ASCII值解题。话说代码是程序员最好的沟通语言,因此直接上Code:
View Code
int isUniqueCh1(char * str) { int i,j; int n = strlen(str); /* 输入字符串的长度 */ int value; for(i = 0; i< n-1; i++) { for(j = n-1; j > i; j--) { value = *(str+i) - *(str+j); /* 两个字符ASCII码相减为0判断相等 */ if( value == 0 ) { return 0; /* Not Unique */ } } } return 1; /* Unique */
这是我自己想到的方法,利用两层循环,两个指针遍历判断字符ASCII值差是否为0。但是看了作者答案之后,发现更妙:
View Code
int isUniqueCh2(char* str) { int n = strlen(str); int i; int value; /* 保存相应字符的ASCII码值 */ int checker = 0; for( i = 0; i < n; i++) { value = *(str+i) - 'a'; if((checker & (1 << value)) > 0) { return 0; /* Not Unique */ } checker |= 1 << value; } return 1; /* Unique */ }
作者答案利用了位运算。但是最精妙的在与将字符串与一串二进制数对应起来。思想就自己看代码理解了,相信很容易看懂的:)。注:作者都是用Java写的,我改用C实现了,其实大同小异。
这边废话几句,作者在本书开头提到希望能使用Java或者C#等OO语言写代码,因为其比较直观,这样有C++背景的面试官也容易理解,但这就见仁见智了,能来面试别人的哪个没几把刷子。而这些人一般都精通几门语言,所以感觉自己哪种语言用的熟,更能实现自己意图就用哪个吧,面试官考察的是解题思路,只要能将思路、算法表述清楚就OK了。
作者实现代码:
View Code
public static boolean isUniqueChars2(String str) { boolean[] char_set = new boolean[256]; for (int i = 0; i < str.length(); i++) { int val = str.charAt(i); if (char_set[val]) return false; char_set[val] = true; } return true; }
以上为个人看后的见解,有不足之处欢迎拍砖,如有更好方法的也欢迎讨论共勉!