LeetCode 9 回文数

欧阳子遥 学生  2020-09-23 09:26:47
bool isPalindrome(int x; { if(x < 0 || x>=2147483647) { return false; }else{ int r esult = 0; int s = 0; int temp = x; while(x != 0) { s = x % 10; result = result * 10 + s; x = x / 10; } if((temp == result || temp == 0)) { return true; } else{ return false; } } } 第一个if为什么x要等于它的取值上限,不等于的话就是那个值会导致result overflow溢出,求解惑。 当然定义为long int 型不会溢出。
...全文
194 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2020-09-24
楼主可以用字符串表示这个数,然后以字符串的中间为分界线,首尾一次比较,都相同表示是回文数,这样不用被数据表示的长度限制
回复
qybao 2020-09-24
引用 5 楼 欧阳子遥 的回复:
谢谢解惑,这个是LeetCode的第9题,其实判断这个溢出,我受到了LeetCode第七题的影响了,昨晚做的时候我跑不过就用了long int。但是后来改的时候,我改成>=之后,跑过了,也明白反转之后会溢出,但是我就不太理解>=2147483647,就可以跑过。>2147483647跑不过,那2147483646反转之后也溢出了,这就感觉有点怪异了。不过,看你的回答之后,我想我之前那种就是不正常的思路。我是根据它的编译器报错改的

不是跟你说了吗?>2147483647跑不过,是因为 >2147483647 就变成负数了,所有不会出现满足 >2147483647 的情况。而>=2147483647,其实只有=能满足情况,所以才说其实用 ==2147483647 就可以了。
至于 2147483646 的回文会溢出,那也不影响判断结果 temp == result,因为溢出了,result就会变成负数,所以 temp == result 是不会成立的。
回复
lin5161678 2020-09-24
引用 5 楼 欧阳子遥 的回复:
[quote=引用 4 楼 lin5161678的回复:]顺便最好把题目链接也贴出来 找题目方便点
谢谢解惑,这个是LeetCode的第9题,其实判断这个溢出,我受到了LeetCode第七题的影响了,昨晚做的时候我跑不过就用了long int。但是后来改的时候,我改成>=之后,跑过了,也明白反转之后会溢出,但是我就不太理解>=2147483647,就可以跑过。>2147483647跑不过,那2147483646反转之后也溢出了,这就感觉有点怪异了。不过,看你的回答之后,我想我之前那种就是不正常的思路。我是根据它的编译器报错改的[/quote] 我提交代码试过 小于0 这个判断有作用 大于等于最大值这个判断有或者没有都行 而且 int > int最大值 这样的判断是永远不成立的 注意存中间结果的变量能存下转换结果就可以了 比如用long long
回复
欧阳子遥 2020-09-24
引用 4 楼 lin5161678的回复:
顺便最好把题目链接也贴出来 找题目方便点
谢谢解惑,这个是LeetCode的第9题,其实判断这个溢出,我受到了LeetCode第七题的影响了,昨晚做的时候我跑不过就用了long int。但是后来改的时候,我改成>=之后,跑过了,也明白反转之后会溢出,但是我就不太理解>=2147483647,就可以跑过。>2147483647跑不过,那2147483646反转之后也溢出了,这就感觉有点怪异了。不过,看你的回答之后,我想我之前那种就是不正常的思路。我是根据它的编译器报错改的😂
回复
lin5161678 2020-09-24
顺便最好把题目链接也贴出来 找题目方便点
回复
lin5161678 2020-09-24
引用 2 楼 欧阳子遥 的回复:
你好,我还是不理解为什么x不能等于2147483647,int型不是-2147483648到2147483647吗?上下限都可以取到呀,要晕了
因为上限值本身不是回文 既然不是回文 return false; 完全合理呀 所以你就会发现 是的这完全是多余的判断 有和没有都不会影响结果 卖萌的 另外按照你的算法 溢出是必然的 和你有没有判断最大值没关系 2147483646 不是最大值 逆序是 6463847421 当然溢出了 用long long 能存下6463847421 当然就不会溢出了
回复
欧阳子遥 2020-09-24
引用 1 楼 qybao的回复:
因为上限值本身不是回文,而且int是有符号的,一旦超过了上限就会变为负数,所以不存在超过上限的情况(其实应该用x==2147483647)。 改成long int可以,是因为long int的范围比int大,可以超过2147483647,此时判断条件就应该改 成x==long int的上限而不是2147483647。
你好,我还是不理解为什么x不能等于2147483647,int型不是-2147483648到2147483647吗?上下限都可以取到呀,要晕了
回复
自信男孩 2020-09-24
引用 9 楼 欧阳子遥 的回复:
[quote=引用 8 楼 自信男孩的回复:]楼主可以用字符串表示这个数,然后以字符串的中间为分界线,首尾一次比较,都相同表示是回文数,这样不用被数据表示的长度限制

谢谢指教,思考了一下,有点像双指针的感觉。一个前,一个后,比较相等之后前+1,后-1。[/quote]
恩,可以用双指针,比如start, end来操作。当然也可以用下表前后比较。其实道理都是一样的
回复
欧阳子遥 2020-09-24
引用 8 楼 自信男孩的回复:
楼主可以用字符串表示这个数,然后以字符串的中间为分界线,首尾一次比较,都相同表示是回文数,这样不用被数据表示的长度限制
谢谢指教,思考了一下,有点像双指针的感觉。一个前,一个后,比较相等之后前+1,后-1。
回复
qybao 2020-09-24
因为上限值本身不是回文,而且int是有符号的,一旦超过了上限就会变为负数,所以不存在超过上限的情况(其实应该用x==2147483647)。 改成long int可以,是因为long int的范围比int大,可以超过2147483647,此时判断条件就应该改 成x==long int的上限而不是2147483647。
回复
发动态
发帖子
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告