C1-Arrays and String【Cracking the Coding Interview 習題解答】

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;
		}
	}
}


1.3 Design an algorithm and write code to remove the duplicate characters in a string without using any additional buffer. NOTE: One or two additional variables are fine. An extra copy of the array is not.
FOLLOW UP
Write the test cases for this method.



1.4 Write a method to decide if two strings are anagrams or not.



1.5 Write a method to replace all spaces in a string with ‘%20’.



1.6 Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, write a method to rotate the image by 90 degrees. Can you do this in place?



1.7 Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0.



1.8 Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring (i.e., “waterbottle” is a rotation of “erbottlewat”).




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章