力扣刷题 题7 题8 题9

题目7

思路:

使用 digit=x % 10 获取最后一位数字。

使用 x /= 10 去掉最后一位数字。

将结果 更新为 result * 10 + digit

class Solution {
public:
    int reverse(int x) {
        int result = 0;

        while (x != 0) {
            int digit = x % 10; // 取最后一位
            x /= 10; // 去掉最后一位

            // 检查是否溢出
            if (result > INT_MAX / 10 || (result == INT_MAX / 10 && digit > 7)) {
                return 0;
            }
            if (result < INT_MIN / 10 || (result == INT_MIN / 10 && digit < -8)) {
                return 0;
            }

            result = result * 10 + digit; // 更新结果
        }

        return result;
    }
};

题目8

这个题真的太恶心了,分支结构要用好几个,用C++写的话代码太长而且晕了,这里参考一个别人写的python代码

class Solution:
    def myAtoi(self, s: str) -> int:
        return max(
            min(
                (
                    lambda v1=s.lstrip(): (
                        lambda v2=(v1[1:] if v1 and v1[0] in "+-" else v1), sign=(
                            -1 if v1[0] in "-" else 1
                        ): (
                            (
                                lambda v3=[
                                    c if c in "0123456789" else "" for c in v2
                                ]: (
                                    lambda v4=(
                                        v3[: v3.index("")] if "" in v3 else v3
                                    ): (
                                        lambda v5="".join(v4): (
                                            int(v5) if v5.isnumeric() else 0
                                        )
                                    )()
                                )()
                                * sign
                            )()
                        )
                    )() if v1 else 0
                )(),
                2**31 - 1,
            ),
            -(2**31),
        )

官方给的题解

class Automaton {
    string state = "start";
    unordered_map<string, vector<string>> table = {
        {"start", {"start", "signed", "in_number", "end"}},
        {"signed", {"end", "end", "in_number", "end"}},
        {"in_number", {"end", "end", "in_number", "end"}},
        {"end", {"end", "end", "end", "end"}}
    };

    int get_col(char c) {
        if (isspace(c)) return 0;
        if (c == '+' or c == '-') return 1;
        if (isdigit(c)) return 2;
        return 3;
    }
public:
    int sign = 1;
    long long ans = 0;

    void get(char c) {
        state = table[state][get_col(c)];
        if (state == "in_number") {
            ans = ans * 10 + c - '0';
            ans = sign == 1 ? min(ans, (long long)INT_MAX) : min(ans, -(long long)INT_MIN);
        }
        else if (state == "signed")
            sign = c == '+' ? 1 : -1;
    }
};

class Solution {
public:
    int myAtoi(string str) {
        Automaton automaton;
        for (char c : str)
            automaton.get(c);
        return automaton.sign * automaton.ans;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/string-to-integer-atoi/solutions/183164/zi-fu-chuan-zhuan-huan-zheng-shu-atoi-by-leetcode-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目9

#include <iostream>

class Solution {
public:
    bool isPalindrome(int x) {
        // 负数和以 0 结尾的非零数不是回文数
        if (x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }

        int reversed = 0;
        while (x > reversed) {
            reversed = reversed * 10 + x % 10;
            x /= 10;
        }

        // 当数字长度为奇数时,通过 reversed/10 去除中间的数字
        return x == reversed || x == reversed / 10;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值