CCI_chapter 1
1.1Implement an algorithm to determine if a string has all unique characters What if you can not use additional data structures?
bool isUniqueChars(string str) { unsigned int checklittle = 0; unsigned int checklarger = 0; for(int i = 0; i < str.size();i++) { bool flag = str[i] - 'a' >= 0 ; unsigned int temp; temp = flag ? 1 << (str[i] - 'a') : 1 << (str[i] - 'A'); if(flag){ if( checklittle & temp ) return false; else checklittle |= temp; }else { if(checklarger & temp) return false; else checklarger |= temp; } } return true;
1.2 Write code to reverse a C-Style String
void reverse(char *str){ if(NULL == str) return; char *p = str; while(*p)++p; --p; while(str < p){ char temp = *p; *p = *str; *str = temp; --p; ++str; } }
1.3 Design an algorithm and write code to remove the duplicate characters in a string without using any additional bufer NOTE: One or two additional variables are fine .An extra copy of the array is not
void removeDuplicates(char[] str){ if(NULL == str) return ; int len = strlen(str); if(len < 2) return ; int tail = 1; for(int i = 1; i < len ; i++){ int j; for(j = 0; j < tail ; j++){ if(str[j] == str[i]) break; } if(j == tail){ str[tail] = str[i]; ++tail; } } str[tail] = '\0'; }
这道题里面判断重复也可以使用1.1的思想,不过要提前搞清楚输入参数的字符集
1.4Write a method to decide if two strings are anagrams or not
bool anagram(string s, string t){ if( s.size() != t.size()) return false; if( s.size() == 0) return true; int table[256]; memset(table, 0, sizeof(int) * 256); for(char c : s){ table[c]++; } for(char c: t){ table[c]--; } for (int c : table){ if(c != 0) return false; } return true; }
1.5
1.6Given 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?
void rotate(vector<vector<int> > &matrix) { // Start typing your C/C++ solution below // DO NOT write int main() function int n = matrix.size(); if(n <= 1) return; for( int lay = 0; lay < n/2; lay++){ int start = lay; int end = n - lay -1; for(int i = start ; i < end ; i++){ // record top int temp = matrix[start][i]; //left to top matrix[start][i] = matrix[n -1- i][start]; // bottom to left matrix[n -1- i][start] = matrix[end][n -1-i]; //right to bottom matrix[end][n-1-i] = matrix[i][end]; // top to right matrix[i][end] = temp; } } }
1.7Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0
void setZeroes(vector<vector<int> > &matrix) { // Start typing your C/C++ solution below // DO NOT write int main() function int m = matrix.size(); if(m < 1) return ; int n = matrix[0].size(); bool zeroR = false, zeroC = false; for(int i = 0; i< n ; i++) if(matrix[0][i] == 0){ zeroR = true; break; } for( int i = 0; i< m ; i++){ if(matrix[i][0] ==0){ zeroC = true; break; } } for(int i = 1; i< m; i++) for(int j = 1; j< n; j++) if(matrix[i][j] == 0){ matrix[0][j] = 0; matrix[i][0] = 0; } for(int i = 1; i< m;i++) for( int j = 1; j< n; j++) if(matrix[0][j] ==0 || matrix[i][0] ==0 ) matrix[i][j] = 0; for(int i = 0; i< n && zeroR ; i++) matrix[0][i] = 0; for(int i = 0; i< m && zeroC ; i++) matrix[i][0] = 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”)
bool isRotation(string s1, string s2){ if(s1.size() != s2.size()) return false; if(s1.size() == 0) return true; string ss = s1+ s1; if(string::npos != ss.find(s2)) return true; return false ; }