已开启
【社区学习赛】修复两数相加(n2)代码注释和文档中的描述错误 #154
guzhangMVP创建于 20 天前
【社区学习赛】修复两数相加(n2)代码注释和文档中的描述错误 #154
已开启
共 4 个文件变更+22-8
| @@ -10,11 +10,25 @@ main(): Int32 { | |||
| 10 | if(params.size >= 1) { | 10 | if(params.size >= 1) { |
| 11 | var x: Int32 = Int32.parse(params[0]) | 11 | var x: Int32 = Int32.parse(params[0]) |
| 12 | var n: Int32 = 0 | 12 | var n: Int32 = 0 |
| 13 | + var overflow = false | ||
| 13 | while(x != 0) { | 14 | while(x != 0) { |
| 14 | - n = n * 10 + x % 10 | 15 | + let digit = x % 10 |
| 16 | + // 在乘以10之前检查是否会溢出,而非在溢出后检查 | ||
| 17 | + // 原代码中n为Int32,溢出后值回绕,事后检查 n > 2147483647 永远为false | ||
| 18 | + // 正确做法是在乘法前判断 n*10+digit 是否超出Int32范围 | ||
| 19 | + // Int32最大值2147483647/10=214748364余7,最小值-2147483648/10=-214748364余-8 | ||
| 20 | + if(n > 214748364 || (n == 214748364 && digit > 7)) { | ||
| 21 | + overflow = true | ||
| 22 | + break | ||
| 23 | + } | ||
| 24 | + if(n < -214748364 || (n == -214748364 && digit < -8)) { | ||
| 25 | + overflow = true | ||
| 26 | + break | ||
| 27 | + } | ||
| 28 | + n = n * 10 + digit | ||
| 15 | x = x / 10 | 29 | x = x / 10 |
| 16 | } | 30 | } |
| 17 | - if(n > 2147483647 || n < -2147483648) { | 31 | + if(overflow) { |
| 18 | println(0) | 32 | println(0) |
| 19 | } else { | 33 | } else { |
| 20 | println(n) | 34 | println(n) |
| @@ -2,7 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 | 3 | 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 |
| 4 | 4 | ||
| 5 | -如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 | 5 | +如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。 |
| 6 | 6 | ||
| 7 | 假设环境不允许存储 64 位整数(有符号或无符号)。 | 7 | 假设环境不允许存储 64 位整数(有符号或无符号)。 |
| 8 | 8 | ||
| @@ -10,7 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | 仓颉语法: | 11 | 仓颉语法: |
| 12 | Option类型的isSome()和isNone()语法 | 12 | Option类型的isSome()和isNone()语法 |
| 13 | - Option类型的??语法:a??b, 等同于:if(a.isNone()){b} else {T} | 13 | + Option类型的??语法:a??b, 等同于:if(a.isNone()){b} else {a} |
| 14 | */ | 14 | */ |
| 15 | package cangjieLeetcode.n1_n100 | 15 | package cangjieLeetcode.n1_n100 |
| 16 | import cangjieLeetcode.common.ListNode | 16 | import cangjieLeetcode.common.ListNode |
| @@ -38,4 +38,4 @@ class SolutionN2 { | |||
| 38 | t.next | 38 | t.next |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | -} | 41 | +} |
| @@ -1,8 +1,8 @@ | |||
| 1 | 1 | ||
| 2 | ## 第2题,两数相加 | 2 | ## 第2题,两数相加 |
| 3 | - * 题目描述:https://leetcode.cn/problems/add-two-numbers/description/ | 3 | +题目描述:https://leetcode.cn/problems/add-two-numbers/description/ |
| 4 | ## 解题思路: | 4 | ## 解题思路: |
| 5 | - 迭代两个List,只要满足 l1不为None、l2不为None、进位不为0 中条件之一,就一直迭代 | 5 | + 迭代两个List,只要满足 l1不为None、l2不为None、进位不为0 其中条件之一,就一直迭代 |
| 6 | 每次迭代,sum = l1的值(如果不为空) + l2的值(如果不为空)+ 进位 | 6 | 每次迭代,sum = l1的值(如果不为空) + l2的值(如果不为空)+ 进位 |
| 7 | 7 | ||
| 8 | ## 时间、空间复杂度: | 8 | ## 时间、空间复杂度: |
| @@ -10,4 +10,4 @@ | |||
| 10 | 10 | ||
| 11 | ## 仓颉语法: | 11 | ## 仓颉语法: |
| 12 | Option类型的isSome()和isNone()语法 | 12 | Option类型的isSome()和isNone()语法 |
| 13 | - Option类型的??语法:a??b, 等同于:if(a.isNone()){b} else {T} | 13 | + Option类型的??语法:a??b, 等同于:if(a.isNone()){b} else {a} |