Cracking the Coding Interview 習題解答 Chapter 1
1.1 Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures?
判斷字符串是否有重複字符
o(n^2)時間複雜度算法
public boolean hasUnique(String sentence){
for (int i = 0; i < sentence.length(); i++) {
for (int j = 0; j < sentence.length(); j++) {
if(i!=j && sentence.charAt(i)==sentence.charAt(j))
return false;
}
}
return true;
}
o(n)時間複雜度,增加一個Set空間爲代價
public boolean hasUnique2(String sentence){
Set<Character> set = new HashSet<Character>();
for (int i = 0; i < sentence.length(); i++) {
if(set.contains(sentence.charAt(i)))
return false;
set.add(sentence.charAt(i));
}
return true;
}
o(n)時間複雜度,假設字符爲ASCII碼,進一步減少空間損耗
public boolean hasUnique3(String sentence){
boolean[] char_set = new boolean[256];
for (int i = 0; i < sentence.length(); i++) {
int val = sentence.charAt(i);
if(char_set[val]) return false;
char_set[val] = true;
}
return true;
}
o(n)時間複雜度,假設字符爲'a'~'z',進一步減少空間,使用一個int,32位足夠表示26個字母
public boolean hasUnique4(String sentence){
int checker = 0;
for (int i = 0; i < sentence.length(); i++) {
int val = sentence.charAt(i) - 'a';
if((checker & (1 << val)) > 0) return false;
checker |= (1 << val);
}
return true;
}
1.2 Write code to reverse a C-Style String. (C-String means that “abcd” is represented as five characters, including the null character.)
反轉字符串
java版本
public char[] reverse(char[] cs){
int i=0, j=cs.length-2;
while(i<j){
char tmp = cs[j];
cs[j--] = cs[i];
cs[i++] = tmp;
}
return cs;
}
c++版本
void reverse(char *str) {
char * end = str;
char tmp;
if (str) {
while (*end) {
++end;
}
--end;
while (str < end) {
tmp = *str;
*str++ = *end;
*end-- = tmp;
}
}
}