LEETCODE- The First Day (C++)


代碼參考——————————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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM