LeetCode 刷题【8. 字符串转换整数 (atoi), 9. 回文数】

发布于:2025-07-21 ⋅ 阅读:(15) ⋅ 点赞:(0)

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

自己做 

解:遍历读取

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;

    }
};

9. 回文数

自己做

解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;

    }
};


网站公告

今日签到

点亮在社区的每一天
去签到