很多思路和代码就糅杂在一起了,包括一些题目信息处理。确实题目换成英文的会加大工作量,导致做题速度变慢很多,只能减量了,保证每天练习2-3h
8 String to Integer (atoi)
class Solution {
public:
bool isInt(char ch) {
return ch >= '0' && ch <= '9';
}
bool isLetter(char ch) {
return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
}
int Atoi(vector<int>& inta, bool isNegative) {
int res = 0;
for (int i : inta) {
// 检查是否溢出
if (res > (INT_MAX - i) / 10) {
return isNegative ? INT_MIN : INT_MAX;
}
res = res * 10 + i;
}
return isNegative ? -res : res;
}
int myAtoi(string s) {
int n = s.size();
vector<int> inta;
bool isNegative = false;
bool isRead = false;
int i = 0;
// 忽略前导空格
while (i < n && s[i] == ' ') {
i++;
}
// 处理符号
if (i < n && (s[i] == '-' || s[i] == '+')) {
isNegative = (s[i] == '-');
i++;
}
// 读取数字
while (i < n && isInt(s[i])) {
int x = s[i] - '0';
inta.push_back(x);
i++;
}
// 调用Atoi处理收集到的数字
return Atoi(inta, isNegative);
}
};
这是我修修补补改改后的代码,总结来说,遇到类似限制条件比较多的情况下,只选择正或者负的情况去实现,保证逻辑清晰。下方是错误示范,既要又要,for(int i=…)这个循环完全没必要分这么细,只需要考虑什么情况下是要获取的信息(正负符号,数字):
int myAtoi(string s) {
//A to i
//ignode laeding whitespace --> 删除头部空格
//sgin '+' '-'均保留
//跳过头部的零,如果后面没有其余数字就是0
//截断超过int范围的数字
//读进结束:遇到字母 字符 空格时,后面都不读 . 或者res超出2^31-1的范围
int res = 0 , n = s.size();
vector<int> inta;
bool isNegative = false , isZero = true , isRead = false;
for(int i = 0 ; i < n; i++ ){
//会遇到 English letters , digits (0-9), ' ', '+', '-', and '.'.
if(!isRead){
//遇到字母直接结束
if(isLetter(s[i] )|| s[i] == '.'){return isNegative?-res:res;}
else if(s[i] == '-'){isNegative = true;}
}else{
//读过的情况下,非数字全部break
if(!isInt(s[i])){
res = Atoi(inta ,isNegative);
return isNegative ? -res:res;
}
}
if(isInt(s[i])){//收集数字
int x= s[i] - '0';
inta.push_back(x);
isRead = true;
}
}
res = Atoi(inta ,isNegative);
return isNegative ? -res:res;
}
其实那个数组也完全没必要建立,更清晰的代码如下:
class Solution {
public:
bool isInt(char ch) {
return ch >= '0' && ch <= '9';
}
bool isLetter(char ch) {
return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
}
int myAtoi(string s) {
int res = 0;
int n = s.size();
int i = 0;
// 忽略前导空格
while (i < n && s[i] == ' ') {
i++;
}
// 检查符号
bool isNegative = false;
if (i < n && (s[i] == '+' || s[i] == '-')) {
isNegative = s[i] == '-';
i++;
}
// 读取数字并处理溢出
while (i < n && isInt(s[i])) {
int digit = s[i] - '0';
// 检查是否溢出
if (res > (INT_MAX - digit) / 10) {
return isNegative ? INT_MIN : INT_MAX;
}
res = res * 10 + digit;
i++;
}
return isNegative ? -res : res;
}
};
c++代码积累:判断溢出
if(res > (INT_MAX - digit) /10){
return isNegative?INT_MIN : INT_MAX;
}
res = res * 10 + digit;
//res 结果 digit 新数字
12 Integer to Roman
point : 能把题目信息提取为下方图片:
//默写
class Solution {
public:
string intToRoman(int num) {
vector<pair<int, string>> roman = {
{1000, "M"}, {900, "CM"}, {500, "D"}, {400, "CD"},
{100, "C"}, {90, "XC"}, {50, "L"}, {40, "XL"},
{10, "X"}, {9, "IX"}, {5, "V"}, {4, "IV"}, {1, "I"}
};
string res = "";
for(auto& [value , symbol] : roman){
while(num >= value){
num -= value;
res += symbol;
}
}
return res;
}
};