7.28 字符串中等 8 12

很多思路和代码就糅杂在一起了,包括一些题目信息处理。确实题目换成英文的会加大工作量,导致做题速度变慢很多,只能减量了,保证每天练习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;
    }
};

待完成: 13 17

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值