Leetcode7_整数反转
题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321示例 2:
输入: -123
输出: -321示例 3:
输入: 120
输出: 21注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解题要点
1.注意溢出: 超过最大值溢出 and 小于最小值溢出
图解算法
1.
2.
3.
解题思路
本题如果不考虑溢出问题,是非常简单的。解决溢出问题有两个思路,第一个思路是通过字符串转换加try catch的方式来解决,第二个思路就是通过数学计算来解决。
由于字符串转换的效率较低且使用较多库函数,所以解题方案不考虑该方法,而是通过数学计算来解决。
通过循环将数字x的每一位拆开(从个位向上拆)
注:例如x=123 则ans=3,pop=2
在计算新值时每一步都判断是否溢出。
溢出条件有两个,一个是大于整数最大值MAX_VALUE,另一个是小于整数最小值MIN_VALUE,设当前计算结果为ans,下一位为pop。
注:这里的大于整数最大值和小于整数最小值 指的是在取值范围内的最大最小值
从ans * 10 + pop > MAX_VALUE这个溢出条件来看
当出现 ans > MAX_VALUE / 10 且 还有pop需要添加 时,则一定溢出
当出现 ans == MAX_VALUE / 10 且 pop > 7 时,则一定溢出,7是2^31 - 1的个位数注:这就是相当于最后的结果是32*10+1,这个值是否大于或者小于溢出的条件
从ans * 10 + pop < MIN_VALUE这个溢出条件来看
当出现 ans < MIN_VALUE / 10 且 还有pop需要添加 时,则一定溢出
当出现 ans == MIN_VALUE / 10 且 pop < -8 时,则一定溢出,8是-2^31的个位数
官方代码
直接看官方题解最佳
上面描述了为什么需要提前判断他们的数字,而不是把他们算出来后,其实就是为了防止溢出,所以需要事先检查这个语句是否会溢出
class Solution {
public:
int reverse(int x) {
int rev = ;
while (x != ) {
int pop = x % ;
x /= ;
if (rev > INT_MAX/ || (rev == INT_MAX / && pop > )) return ;
if (rev < INT_MIN/ || (rev == INT_MIN / && pop < -)) return ;
rev = rev * + pop;
}
return rev;
}
};
官方代码改进版
如果不知道7 或者-8,可以直接计算出来,如下改动
class Solution {
public int reverse(int x) {
int rev = ;
while(x != ){
int pop = x % ;
x = x / ;
if(rev > Integer.MAX_VALUE / || (rev == Integer.MAX_VALUE / && pop > Integer.MAX_VALUE % )){
rev = ;
break;
}else if(rev < Integer.MIN_VALUE / || (rev == Integer.MIN_VALUE / && x < Integer.MIN_VALUE % )){
rev = ;
break;
}
rev = rev * + pop;
}
return rev;
}
}
代码1(错误)
遇到的问题:
这段代码自己也能看懂,也明白是什么意思,也可以通过leetcode的测试样例
但是但是就是提交失败,原因是执行错误,在第6行处的Integer
class Solution {
public int reverse(int x) {
int ans = ;
while (x != ) {
int pop = x % ;
if (ans > Integer.MAX_VALUE / || (ans == Integer.MAX_VALUE / && pop > ))
return ;
if (ans < Integer.MIN_VALUE / || (ans == Integer.MIN_VALUE / && pop < -))
return ;
ans = ans * + pop;
x /= ;
}
return ans;
}
}
代码2(正确)
这段代码的作者说上面那个代码判断溢出是很丑陋的,原因在于需要记住末尾数字
两者都是在计算新值时每一步都提前判断是否溢出。
用时8ms,官方用时4ms
class Solution {
public:
int reverse(int x) {
int res = ;
while (x != ) {
if (res < INT_MIN/) return ;
if (res > INT_MAX/) return ;
res *= ;
int m = x % ;
if (m < && res < INT_MIN - m) return ;
if (m > && res > INT_MAX - m) return ;
res += m;
x /= ;
}
return res;
}
};
原题链接
7. 整数反转
参考链接
碎碎念
2019-09-20 00:05:47
今天的我还是太菜了,本来这道题是9.18的,但是自己只是大概看懂算法了,所以还没实现,今晚就实现了下
17,19号的leetcode还没有刷,每天一道的话,再加上今天20号
少了3道题
那么今天就要刷三道easy
冲鸭
Leetcode7_整数反转的更多相关文章
- Leetcode(力扣) 整数反转
Leetcode 7.整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例: 输入: -123 输出: -321 注意: 假设我们的环境只能存储得下 32 位的有符 ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...
- C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数
各位相加 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 输出: 解释: 各位相加的过程为: + = , + = . 由于 是一位数,所以返回 . 进阶:你可以 ...
- leecode刷题(12)-- 整数反转
leecode刷题(12)-- 整数反转 整数反转 描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: - ...
- leetcode7_C++整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 输出: 示例 2: 输入: - 输出: - 示例 3: 输入: 输出: 注意: 假设我们的环境只能存 ...
- Leecode刷题之旅-C语言/python-7.整数反转
/* * @lc app=leetcode.cn id=7 lang=c * * [7] 整数反转 * * https://leetcode-cn.com/problems/reverse-integ ...
- ACM_整数反转
整数反转 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定一个32位int型的整数,把这个整数反着输出,如123,输出321. ...
- LeetCode Golang 7. 整数反转
7. 整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. Tips : Math包给出的类型大小的边界: // Integer limit values. const ...
- 【Leetcode】【简单】【17. 整数反转】【JavaScript】
题目描述 7. 整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321示例 3: 输 ...
随机推荐
- Codeforces 400C 矩阵乘法 数学规律
今天下午Virtual了一套最近的CF题,第三题给TLE了,就跑过去上课了. 这题给定一个由二进制表示的矩阵,当询问3的时候,求矩阵的值,矩阵的值是所有第i行乘以第i列的值的总和,然后还有1 b是翻转 ...
- 1月18日 LCA专项训练
A. Lorenzo Von Matterhorn B.Minimum spanning tree for each edge C.Misha, Grisha and Underground D.Fo ...
- UML-GRASP总结
对象设计的核心 1).对象交互 2).职责分配
- [极客大挑战 2019]EasySQL
万能密码直接登陆得到flag admin' or 1=1 #
- Python—二叉树数据结构
二叉树 简介: 二叉树是每个结点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree). 二叉树二叉树的链式存储: 将二叉树的节点定义为 ...
- openlayers的loaders方式加载
openlayers loaders方式加载 let layerVector = new ol.layer.Vector({ source : new ol.source.Vector({ loade ...
- Cannot find tomcat目录/bin/setclasspath.sh This file is needed to run this program
首先如果直接使用 root 用户来启动 tomcat 的话,是可以正常启动的. 但是我们在 Linux 中使用普通用户启动 tomcat 报了如下错误 Cannot find /developer/a ...
- 01 语言基础+高级:1-9 网络编程_day11【网络编程】
day11[网络编程] 主要内容 软件架构CS/BS 网络通信三要素 TCP通信 Socket套接字 ServerSocket 教学目标 能够辨别UDP和TCP协议特点 能够说出TCP协议下两个常用类 ...
- PIL对象和numpy三维数组的互相转换
#https://stackoverflow.com/questions/384759/how-to-convert-a-pil-image-into-a-numpy-array from PIL i ...
- 漫谈设计模式(三):桥接(Bridge)模式 —— 将类功能、结构两层次分离
1.前言 类主要有两个层次,一个是功能层次,另一个是实现层次. 功能层次,一般应用于当前类不能满足多样化的业务需求,让子类去继承(具体)父类,添加加一些父类中没有的功能(一般是增加新的方法),这就属于 ...


