7. 整数反转

题目:https://leetcode-cn.com/problems/reverse-integer/

解法一:$O(logn)$ 常规反转

  1. 常规反转,通过不断取余提取个位,并将个位存储到res
  2. res每次进行乘10操作,相当于左移一位。
  3. 如果res为整数类型,讨论越界问题会较为复杂。可以分为以下两种情况,其中cur代表末位
static const auto _____ = []()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr); 
    return nullptr;
}();
class Solution {
public:
    int reverse(int x) {
        long long res = 0;
        while(x){
            res = res * 10 + x % 10;
            x = x / 10;
        }
        if(res > INT_MAX || res < INT_MIN) return 0;
        return res;
    }
};

8. 字符串转换整数 (atoi)

题目:https://leetcode-cn.com/problems/string-to-integer-atoi/

解法一:$O(n)$ 模拟,充分考虑所有情况即可

  1. 处理空格,如果前面有空格,则利用一个while循环不断向后迭代
  2. 处理正负号,通过sign记录当前我们处理的数字是正还是负
  3. 处理可能存在的越界问题 ans < div || (ans == div && str[i] <= '7)
  4. ans不断乘10,这里用位运算来模拟乘10操作 ans * 10 = ans * 8 + ans * 2 = (ans << 3) + (ans << 1)
  5. 结果如果越界则直接返回INT_MININT_MAX
class Solution {
public:
    int myAtoi(string str) {
        int ans = 0;
        int i = 0;
        int sign = 0;
        while (str[i] == ' ') i++;
        if (str[i] == '-') {
            sign = 1;
            i++;
        }
        else if (str[i] == '+') i++;
        if (str[i] < '0' || str[i] > '9') return 0;
        int div = INT_MAX / 10;
        while (str[i] >= '0' && str[i] <= '9') {
            if (ans < div || (ans == div && str[i] <= '7')) {
                ans = (ans << 3) + (ans << 1) + (int) (str[i] - '0');
                i++;
            } else return (sign == 1) ? INT_MIN : INT_MAX;
        }
        return (sign == 1) ? -1 * ans : ans;
    }
};

9. 回文数

题目:https://leetcode-cn.com/problems/palindrome-number/