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

猜你喜欢

转载自www.cnblogs.com/Daniellovejedidah/p/10806632.html
今日推荐