题目

给出一个 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. 整数反转

参考链接

画解算法:7. 整数反转

整数反转

碎碎念

2019-09-20  00:05:47

今天的我还是太菜了,本来这道题是9.18的,但是自己只是大概看懂算法了,所以还没实现,今晚就实现了下

17,19号的leetcode还没有刷,每天一道的话,再加上今天20号

少了3道题

那么今天就要刷三道easy

冲鸭

Leetcode7_整数反转的更多相关文章

  1. Leetcode(力扣) 整数反转

    Leetcode 7.整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例: 输入: -123 输出: -321 注意: 假设我们的环境只能存储得下 32 位的有符 ...

  2. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  3. C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数

    各位相加 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 输出: 解释: 各位相加的过程为: + = , + = . 由于 是一位数,所以返回 . 进阶:你可以 ...

  4. leecode刷题(12)-- 整数反转

    leecode刷题(12)-- 整数反转 整数反转 描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: - ...

  5. leetcode7_C++整数反转

      给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 输出:  示例 2: 输入: - 输出: - 示例 3: 输入: 输出: 注意: 假设我们的环境只能存 ...

  6. Leecode刷题之旅-C语言/python-7.整数反转

    /* * @lc app=leetcode.cn id=7 lang=c * * [7] 整数反转 * * https://leetcode-cn.com/problems/reverse-integ ...

  7. ACM_整数反转

    整数反转 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定一个32位int型的整数,把这个整数反着输出,如123,输出321. ...

  8. LeetCode Golang 7. 整数反转

    7. 整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. Tips : Math包给出的类型大小的边界: // Integer limit values. const ...

  9. 【Leetcode】【简单】【17. 整数反转】【JavaScript】

    题目描述 7. 整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321示例 3: 输 ...

随机推荐

  1. 微信小程序返回页面传值

    一.通过url传递参数,但由于navigateTo无法跳转到导航页,所以无法往导航页传递参数 wx.navigateTo({ url: 'test?id=1' }) 二.通过wx.navigateBa ...

  2. 技术沙龙|原来落地AI应用是这么回事儿!

    目前人工智能已经迈入应用落地之年,作为备受关注的话题,在重磅政策的加持下市场规模迅速扩大并渗透到各行各业的形势越发鲜明.在此背景下,作为国内不容忽视的创新企业之一,京东AI依托于NeuHub平台对数据 ...

  3. h5-动画小案例-滚动展示

    1.html区域 <div> <ul> <li><img src="../img/a.jpg" alt="">& ...

  4. h5-提升移动端的响应区域

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. idtcp实现文件下载和上传

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  6. FileReader笔记

    FileReader API链接地址:https://developer.mozilla.org/en-US/docs/Web/API/FileReader 实例代码: <!DOCTYPE ht ...

  7. 如何实现MVC ActionResult 返回类型为JavaScriptResult

    必需的js引用文件 <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>@Scripts ...

  8. 乳草的侵占(BFS)

    armer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份占领了一片立足之地. 草地像往常一样,被分割成一个高度 ...

  9. 吴裕雄--天生自然 PYTHON3开发学习:元组

    tup1 = ('Google', 'Runoob', 1997, 2000) tup2 = (1, 2, 3, 4, 5, 6, 7 ) print ("tup1[0]: ", ...

  10. Java文字识别软件-调用百度ocr实现文字识别

    java_baidu_ocr Java调用百度OCR文字识别API实现图片文字识别软件 这是一款小巧方便,强大的文字识别软件,由Java编写,配上了窗口界面 调用了百度ocr文字识别API 识别精度高 ...