代碼參考——————————https://soulmachine.gitbooks.io/algorithm-essentials/content/cpp/
Valid Palindrome (字符串對稱)
功能測試:字符串是否是對稱的
邊界測試:輸入全是標點符號
負面測試:輸入不是字符串
分析:a. 字母大小寫轉換(都變為小寫) b.首尾夾逼比較 c.遇到標點符號跳過
1 class Solution { 2 public: 3 bool isPalindrome(string s) { 4 transform(s.begin(),s.end(),s.begin(),::tolower);//字母轉小寫 5 auto left = s.begin(), right = prev(s.end()); //s.end->'\0' 6 while(left < right){ 7 //::isalnum判斷字符變量是否為字母或數字 8 if(!::isalnum(*left)) ++left; 9 else if (!::isalnum(*right)) --right; 10 else if (*left != *right) return false; 11 else {left++; right--;} 12 } 13 return true; 14 } 15 };
Implement strStr() (needle是否是haystack的一部分,其中它們都是字符串)
功能測試:needle是否是haystack的一部分
負面測試:輸入為空
分析:暴力解法時間復雜度O(m*n)
1 class Solution { 2 public: 3 int strStr(const string& haystack,const string& needle) { 4 //不考慮輸入大小寫問題 5 if(needle.empty()) return 0; 6 7 const int N = haystack.size() - needle.size() + 1; 8 for(int pointer = 0; pointer < N; pointer++){ 9 int temph = pointer; 10 int tempn = 0; 11 while(temph < haystack.size() && tempn < needle.size() && haystack[temph] == needle[tempn]){ 12 temph++; 13 tempn++; 14 } 15 if(tempn == needle.size()) return pointer; 16 } 17 return -1; 18 } 19 };
String to Integer(atoi) (將字符串轉換為數字)
功能測試:是否轉換成功並返回數字 字符串除空格外第一個字符必須為數字或者是正負號
邊界測試:超出int范圍使用INT_MIN或INT_MAX替代
負面測試:輸入為空
int num = 0;
int sign = 1; const int n = str.length(); if (n==0) return 0; int i = 0; while(str[i]==' '&& i<n ) i++; if(str[i] == '+'){ i++; }else if (str[i] == '-'){ sign = -1; i++; } for(;i < n;i ++){ if(str[i] < '0' || str[i] > '9') break; if(num > INT_MAX/10 || (num == INT_MAX / 10 &&(str[i]-'0') > INT_MAX %10)){ return sign == -1? INT_MIN: INT_MAX; } num = num * 10 + str[i]-'0'; //輸入為2147483640時會提示runtime error:
//pointer index expression with base 0x000000000000 overflowed to 0xffffffffffffffff (basic_string.h) } return num*sign;
Add Binary
功能測試:二進制加法
邊界測試:考慮進位
負面測試:輸入都不為空(不用考慮)
1 class Solution { 2 public: 3 string addBinary(string a,string b) { 4 string result; 5 int i = a.length() - 1; 6 int j = b.length() - 1; 7 int carry = 0; 8 9 while(i >= 0 || j>=0 || carry > 0){ 10 int valueA = i < 0? 0 : a[i--] - '0'; 11 int valueB = j < 0? 0 : b[j--] - '0'; 12 int sum = valueA + valueB + carry; 13 result.insert(result.begin(),(sum%2) +'0'); //頭插入 14 carry = sum / 2; 15 } 16 return result; 17 } 18 };
Longest Palindromic Substring
功能測試:最長回文子串
邊界測試:兩個相同並列
負面測試:輸入都不為空(不用考慮)
1 // Longest Palindromic Substring 2 // 動規,時間復雜度O(n^2),空間復雜度O(n^2) 3 class Solution { 4 public: 5 string longestPalindrome(const string& s) { 6 const int n = s.size(); 7 bool f[n][n]; 8 fill_n(&f[0][0], n * n, false); 9 // 用 vector 會超時 10 //vector > f(n, vector(n, false)); 11 size_t max_len = 1, start = 0; // 最長回文子串的長度,起點 12 13 for (size_t i = 0; i < s.size(); i++) { 14 f[i][i] = true; 15 for (size_t j = 0; j < i; j++) { // [j, i] j->start i->end 16 f[j][i] = (s[j] == s[i] && (i - j < 2 || f[j + 1][i - 1])); 17 if (f[j][i] && max_len < (i - j + 1)) { 18 max_len = i - j + 1; 19 start = j; 20 } 21 } 22 } 23 return s.substr(start, max_len); 24 } 25 };