LeetCode 6-10 題解
阿新 • • 發佈:2021-09-15
6 中等
Soluion
- 模擬規律題
- 找同一行相鄰兩個字元再原字串中的間隔
Sample Code (map)
class Solution { public: string convert(string s, int numRows) { if(numRows == 1) return s; string res = ""; int len = s.length(); for(int i = 1; i <= numRows; ++i){ for(int j = i; j <= len; j += 2 * numRows - 2){ res += s[j - 1]; if(i == 1 || i == numRows) continue; if(j + 2 * numRows - 2 * i <= len) res += s[j + 2 * numRows - 2 * i - 1]; } } return res; } };
7 簡單
Soluion
- 取符號+取正數反轉
- 判斷範圍
Sample Code
class Solution { public: int reverse(int x) { bool flag = false; long long xx = (long long)x; if(x < 0) { xx = -xx; flag = true; } long long reverse_xx = 0; while(xx){ int bit = xx % 10; reverse_xx = reverse_xx * 10 + bit; xx /= 10; } //0x7fffffff, 0x80000000 long long up = (long long)1 << 31; if(reverse_xx > up) return 0; if(reverse_xx == up && flag == false) return 0; return (flag ? -1 : 1) * reverse_xx; } int };
8 中等
Soluion
- 設定不同字元的讀入狀態
- 特判符號
- 模擬
Sample Code (map)
class Solution { public: int getState(char s){ if(s >= '0' && s <= '9') return 2; if(s == ' ') return 0; if(s == '-' || s == '+') return 1; return -1; } int myAtoi(string s) { int state = 0; long long res = 0; int flag = 1; for(int i = 0; s[i]; ++i){ int curState = getState(s[i]); if(curState < state) return flag * res; state = curState; if(curState == 1){ flag = s[i] == '-' ? -1 : 1; ++state; }else{ if(curState == 2){ res = 10 * res + (s[i] - '0'); if(res > (long long)0x7fffffff && flag == 1) return 0x7fffffff; if(res > (long long)0x80000000 && flag == -1) return 0x80000000; } } } return flag * res; } }; /* state = 0; 前導空格狀態 state = 1; 檢查符號狀態 state = 2; 讀入數字狀態 */
9 簡單
Soluion
- 反轉即可
- 特判符號
Sample Code (map)
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0) return false;
long long xx = (long long)x;
long long t = 0;
while(xx){
int bit = xx % 10;
xx /= 10;
t = 10 * t + bit;
}
return (long long)x == t;
}
};
10 困難
Soluion
- dp
- 預處理*的匹配
Sample Code (map)
class Solution {
public:
int dp[1010][1010];
bool charMatch(char a, char b){
return a == b || b == '.';
}
bool isMatch(string s, string p) {
int len1 = s.length();
int len2 = p.length();
dp[0][0] = 1;
int cnt = 0;
for(int i = 0; i < len2; ++i){
if(p[i] == '*') ++cnt;
else --cnt;
if(cnt == 0) dp[0][i + 1] = 1;
else dp[0][i + 1] = 0;
}
for(int i = 0; i < len1; ++i)
for(int j = 0; j < len2; ++j){
if(charMatch(s[i], p[j])) dp[i + 1][j + 1] = dp[i][j];
else {
if(p[j] == '*'){
int k;
for(k = i; k >= 0 && charMatch(s[k], p[j - 1]); --k)
dp[i + 1][j + 1] |= dp[k][j - 1];
// if(k >= 0)
dp[i + 1][j + 1] |= dp[i + 1][j - 1];
}
else dp[i + 1][j + 1] = 0;
}
}
return dp[len1][len2] == 1;
}
};
不忘初心