

自己做
解:遍历读取

class Solution {
public:
int myAtoi(string s) {
int sum = 0; //读取的数字
int len = s.size(); //字符串长度
bool sub_num = false; //数字符号【默认为+】
bool frist = false; //表示遇到第一个正负号
//从左往右读
int start = 0;
while (s[start] == ' ') //忽略字符串前面的空格
start++;
for (int i = start; i < len; i++) {
if (s[i] < 48 && s[i] > 57 && s[i] != '+' && s[i] != '-' && !frist) //遇到了非数字非+-的字符直接返回
return sum;
if ((s[i] == '+' || s[i] == '-') && !frist) { //遇到的第一个正负符号
if (s[i] == '-') //负号
sub_num = true;
frist = true;
continue; //跳过累加
}
if (s[i] >= 48 && s[i] <= 57 && !frist) //没有+-,直接是数字
frist = true;
//累加
if (s[i] >= 48 && s[i] <= 57) { //是数字
int add = s[i] - 48;
if (sub_num) //为负的情况
add = -add;
//累加前判断溢出
if (!sub_num &&
sum > std::numeric_limits<int>::max() / 10 ||
(sum == std::numeric_limits<int>::max() / 10 && add > 7)
) //为正大于最大值
return std::numeric_limits<int>::max();
if (sub_num &&
sum < std::numeric_limits<int>::min() / 10 ||
(sum == std::numeric_limits<int>::min() / 10 && add < -8)
) //为负小于最小值
return std::numeric_limits<int>::min();
sum = sum * 10 + add; //累加
}
else { //遇到非数字,直接返回
return sum;
}
}
return sum;
}
};


自己做
解1:求余取数

class Solution {
public:
bool isPalindrome(int x) {
int left_div = 1;
int right_div = 1;
int mutil = 10;
int len = 1; //x的长度
//负数必定不是回文数
if (x < 0)
return false;
//cout << x / left_div << endl;
while (x / left_div >= 10) {
left_div *= 10;
len++;
}
//cout << left_div << ","<< len <<endl;
for (int i = 0; i < len / 2; i++) { //比较一半即可
if (x / left_div % 10 == x % mutil / right_div) { //相等
left_div /= 10;
right_div *= 10;
mutil *= 10;
}
else { //出现不相等
return false;
}
}
return true;
}
};
解2:转换字符串

class Solution {
public:
bool isPalindrome(int x) {
string s;
if (x < 0)
return false;
while (x != 0) {
s.push_back(x % 10 + 48); //ASCII码转换
x /= 10;
}
int len = s.size();
for (int i = 0; i < len / 2; i++) {
if (s[i] != s[len - 1 - i])
return false;
}
return true;
}
};