【LeetCode】 #7:反转整数 C语言
最近打算练习写代码的能力,所以从简单题开始做。
大部分还是用C语言来解决。
@
题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路
其实这算很基础的问题了,首先就是想到利用循环结构,整数除法和取余来解决。但也会遇到边界值的问题,就要小心了。
初步想法
初步的想法就是用一个while循环,在循环里面解决取余和倒序相加的工作。
具体代码如下:
int reverse(int x) {
int num = 0;
while (x)
{
num = num * 10 + x % 10;
if (num > INT_MAX || num < INT_MIN)//边界值判断
return 0;
x = x / 10;
}
return num;
}
但是这种结构很容易遇到一个问题,就是当num达到边界时,再进行*10的运算就会溢出了,但判断在运算之后。
但是我又想到在C语言中还有long int类型,所以只要定义num为long int即可。
最后也通过了,代码如下:
int reverse(int x) {
long int num = 0;
while (x)
{
num = num * 10 + x % 10;
if (num > INT_MAX || num < INT_MIN)
return 0;
x = x / 10;
}
return num;
}
总结:这种改善也只是一种取巧的方法,当数据更大时就没办法了,而且会浪费很多空间。
进一步想法
于是我看了官方题解,发现官方是通过判断num与边界值的距离来避免溢出的。
我首先将if判断进行了替换,但发现还是不能通过,因为最小的边界还是会溢出,然后我发现官方题解中是先判断再进行倒序操作的,这样就可以有效解决问题了。
int reverse(int x) {
int num = 0;
while (x)
{
if (num > INT_MAX/10 || (num == INT_MAX / 10 && (x%10) > 7)) return 0;
if (num < INT_MIN/10 || (num == INT_MIN / 10 && (x%10) < -8)) return 0;
num = num * 10 + x % 10;
x = x / 10;
}
return num;
}
我觉得这个方法要求的判断条件太细致了,然后去网上看了看其他人的解法。有博主提到利用反推法判断是否溢出,但其实这种方法也是先计算再判断的。
具体链接 https://blog.csdn.net/bingkuoluo/article/details/83046469
我尝试提交后发现仍然会面临最大值溢出的问题,也不够安全,暂时没有找到更好的办法。
总结
注意语句的顺序问题,尤其是判断语句和判断条件的运算的问题。
要考虑数据的溢出问题。
在本题中,还是要先判断,再运算。
【LeetCode】 #7:反转整数 C语言的更多相关文章
- LeetCode 4.反转整数
给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: ...
- LeetCode 7. 反转整数(Reverse Integer)
题目描述 给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 ...
- Leetcode 7.反转整数 By Python
给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假 ...
- leetcode记录-反转整数
给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假 ...
- Leetcode 7 反转整数Reverse Integer
给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: ...
- 【LeetCode题解】7_反转整数
目录 [LeetCode题解]7_反转整数 描述 方法一 思路 Java 实现 类似的 Java 实现 Python 实现 方法二:转化为求字符串的倒序 Java 实现 Python 实现 [Leet ...
- leetcode每日一题——反转整数
题目: 反转整数 难度: 简单 描述: 给定一个 32 位有符号整数,将整数中的数字进行反转. 解法: class Solution { public int reverse(int x) { //i ...
- LeetCode刷题--整数反转(简单)
题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 12 ...
- C#版(击败97.76%的提交) - Leetcode 557. 反转字符串中的单词 III - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...
随机推荐
- presto-gateway nodejs client
目前已经有了好几个presto nodejs 的client,为了方便presto-gateway 的连接,修改了一个现有的nodejs client 可以方便的连接presto-gateway 原理 ...
- JS继承2
一.原型链继承 关键步骤: 让子类的原型对象成为父类的实例 矫正子类构造器属性 function Animal(name,age){ this.name = name; this.age = age; ...
- MySQL 8.0 以上版本重置 root 用户密码的终极办法
1. 在 /etc/my.cnf 文件末尾追加 skip-grant-tables [root@abdefg mysql]# vim /etc/my.cnf [mysql] # 设置mysql客户端默 ...
- 洛谷 P1396
P1396 传送门 扯些题外话 讲真的我刚看到这个题的时候真的傻fufu的..... 大体题意 找出从s走到t的拥挤度最大值最小.. 思路 说最大值最小可能就会有dalao开始二分了. 想我这种的蒟蒻 ...
- 调用Fluent进行多工况计算总结
算例来源:https://confluence.cornell.edu/display/SIMULATION/FLUENT+-+Turbulent+Pipe+Flow 有时候我们对同一模型进行多工况计 ...
- SpringBoot之AOP使用
说到SpringBoot,难免会想到Spring.对于Spring,我曾用其开发过很多大大小小的项目.当使用SpringBoot之后,给人最直观的感受,用古人一句话:”大道至简”. SpringBoo ...
- test软件工程第三次作业
零.前言 本次作业要求个人编写程序,截止日期2019年9月25日23:00. 请先阅读<构建之法>第一章至第三章的内容,并在下方作业里体现出阅读后的成果.特别是第2章中的效能分析及个人软件 ...
- uniapp - emmet
话说,emment是官方uniapp直接引入的.基本上没做啥修改:可以点这里查看所有用法 - http://emmet.evget.com/ 1.类似css层级写法 1.1 view.ok>vi ...
- java项目中使用ffmpeg剪辑部分视频
在项目中,有个需求是分享视频链接地址到微信.qq或者朋友圈,只能试看两分钟,本想着通过h5界面就能控制实现效果,代码如下,但是前端终究不是安全的,其次监听事件,如果拉播放进度条,中途停顿多次,就会出现 ...
- thymeleaf和freemarker比较
http://freemarker.cn/archives/168.html https://www.zhihu.com/question/64039553/answer/215942472 http ...