字符串- 字符串转换整数 (atoi)

题目:

https://leetcode.cn/problems/string-to-integer-atoi/description/

代码

cpp 复制代码
/*
参数:字符串
返回值:转换为的32为有符号整数;
*/
int myAtoi(string s) {
    int n = s.size();
    //1、去除前导空格
    int i = 0;
    while (i < n && s[i] == ' ') {
        i++;
    }
    //2、检查符号;
    int sign = 1;
    if (i< n &&(s[i] == '-' || s[i] == '+')) {
        sign = (s[i] == '-') ? -1 : 1;
        i++;
    }
    //3、读数,读到非数字或到达字符串末尾
    int result = 0;
    while (i < n && isdigit(s[i])){
        int digit = s[i] - '0';
        // 检查溢出(处理 INT_MAX 和 INT_MIN 的边界)
        if (result > (INT_MAX - digit) / 10) {
            return (sign == 1) ? INT_MAX : INT_MIN;
        }
        result = result * 10 + digit;
        i++;
    }
    return sign * result;
    
}

分析:

1、分析越界设计

if (result > (INT_MAX - digit) / 10) {

return (sign == 1) ? INT_MAX : INT_MIN;

}

这里的分析越界的设计比较有意思,

越界的可能出现在result值变更的某个时机,在这时机之前我们先进行安全性判断;
2、为什么用 result > (INT_MAX - digit) / 10 来判断?

这是为了避免在判断过程中本身就发生溢出。

假设我们直接判断 result * 10 + digit > INT_MAX,当 result 很大时,result * 10 可能已经超过 INT_MAX,导致计算过程中就发生溢出(例如 result = 214748365 时,result * 10 已经是 2147483650,超过 INT_MAX 的 2147483647),此时的判断结果是不可靠的。

通过数学变形可以避免这个问题:

result * 10 + digit > INT_MAX

→ 移项得:result * 10 > INT_MAX - digit

→ 两边除以 10(因都是正数,不等号方向不变):result > (INT_MAX - digit) / 10

这样的变形确保了所有计算都在 INT_MAX 范围内进行,不会发生中间溢出,判断更安全。

3. 为什么没有单独判断 result * 10 + digit < INT_MIN 也能生效?

==》

对于正数,精确判断是否超过 INT_MAX;

对于负数,通过 "判断是否超过 INT_MAX" 来覆盖 "超过 INT_MIN 绝对值" 的场景。

其实因为INT_MIN绝对值和INT_MAX绝对值只差1,因为结果是整数,不是小数,超过INT_MAX之后下一个数就是INT_MIN的绝对值了,即事实上本来就得返回INT_MIN,所以无误差

相关推荐
m0_639906943 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
ZhengEnCi4 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
秋天的怀念_David4 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi5 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6185 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang5 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
2601_970703837 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你02147 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
ZhengEnCi8 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
Flynn Liang8 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai