【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 ...
随机推荐
- webpack打包vue单文件组件
一.vue单文件组件 ①文件扩展名为 .vue 的 就是single-file components(单文件组件) ②参考文档:单文件组件 二.webpack加载第三方包 ①项目中,如果需要用到一些第 ...
- 第04组alpha冲刺(4/4)
队名:斗地组 组长博客:地址 作业博客:Alpha冲刺(4/4) 各组员情况 林涛(组长) 过去两天完成了哪些任务: 1.分配展示任务 2.收集各个组员的进度 3.写博客 展示GitHub当日代码/文 ...
- luogu P3327 [SDOI2015]约数个数和 莫比乌斯反演
题面 我的做法基于以下两个公式: \[[n=1]=\sum_{d|n}\mu(d)\] \[\sigma_0(i*j)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]\] 其中\(\ ...
- 传统IT容量估算思路
参考: https://www.cnblogs.com/zhangweizhong/p/5844961.html https://www.cnblogs.com/zhangweizhong/p/577 ...
- 第08组 Alpha冲刺(6/6)
队名:955 组长博客:https://www.cnblogs.com/cclong/p/11913269.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...
- 【Gamma】Scrum Meeting 1 & 与助教谈话
前言 Gamma阶段第1次会议在5月26日22:00由PM在大运村一公寓三层召开, 时长30min. 任务分配 姓名 今日任务 明日任务 困难 周博闻 用户控制器解耦和注释 用户控制器解耦和注释 周国 ...
- Gamma阶段第五次scrum meeting
每日任务内容 队员 昨日完成任务 明日要完成的任务 张圆宁 #91 用户体验与优化https://github.com/rRetr0Git/rateMyCourse/issues/91(持续完成) # ...
- MLflow系列1:MLflow入门教程(Python)
英文链接:https://mlflow.org/docs/latest/tutorial.html 本文链接:https://www.cnblogs.com/CheeseZH/p/11943280.h ...
- java只允许输入数字字母下划线中文
public static void main(String[] args) { Pattern pattern = Pattern.compile("[_0-9a-z]+"); ...
- Maven依赖包导入错误(IntelliJ IDEA):java.lang.OutOfMemoryError: GC overhead limit exceeded
一.问题背景 最近用IntelliJ IDEA 打开一个老应用,一直加载依赖不成功,主POM中存在如下错误. java.lang.OutOfMemoryError:GC overhead limit ...