leetcode——Reverse Integer

前言

leetcode的刷题记录,整理思路和一些理论细节。

Question

给出一个32比特大小的整数,对其逆序。

Example 1:

Input: 123
Output: 321

Example 2:

Input: -123
Output: -321

Example 3:

Input: 120
Output: 21

Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^{31}, 2^{31} − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

题目分析

题目的意思就是将一个4字节的整数逆序。这个整数存储在计算机中的最高位是符号位,后面是有效位。题目要求如果逆序之后的整数溢出了,那么返回0。

思路

Note 1:题目限制了整数大小是4字节的有符号整数,而我们逆序之后的整数有可能会超过题目限制的整数范围,因此在逆序过程中要对整数进行判断,如果它超过了范围,那么返回0。

Note 2: 如何提取出整数的个、十、百、千...位呢?可以使用求余数的方法来得到。即取余求商交替进行,就可以从低到高依次得到整数各位上的数。之后依次相加即可。

整数溢出

计算机是用二进制来存储整数的。为了存储不同大小的整数,C语言将整数分为了short int ,int,long int,long long int四种类型。其中short类型大小<=int类型大小,int<=long

又有unsignedsigned标识符用来表示无符号或者有符号。它们能与上述四种类型自由组合。c语言中定义整数时如果省略了上述符号标识符则默认整数为signed

现代计算机中通常是long long占64位,long占32位,short占16位,int占16位或32位(依计算机的自然字长而定)。

整数在计算机内存中是用二进制来存储的。如果是有符号整数signed,那么存储方法通常为二进制补码(具体依赖于硬件实现,与c语言无关)。对于无符号整数unsigned,使用二进制码来存储。整数常量通常被视为是signed int类型,如果不够则编译器会从小到大依次尝试使用一个更大的类型。如unsigned intsigned long

整数有可能会超出某个已经定义好的类型的范围。此时会发生“整数溢出”的问题。

无符号整数的溢出

上溢

一个整数通过运算(赋值),超过了它能表示的上限,则会变成一个很小的数。

对于unsigned整数而言,假设int类型占32位,则其最大取值是4294967295,最小取值是0。定义unsigned int i = 4294967295;。如果超出了此范围,例如i+1,则其实际值为0。规律是当达到所能表示的最大值时,unsigned变量从0开始递增。

因为无符号整数没有符号位,最大无符号整数的二进制位必然是全为1的,再加上某个数例如1后,使用二进制加法逢2进1。最终变为了全为0。即十进制的0。相当于重新开始计数。

因此对于无符号整数而言,如果超可以认为它是不会有溢出的,仅仅是重新从0开始计数。

下溢

一个整数通过运算(赋值),低于它能表示的下限,则会变成一个很大的数。

无符号整数最小取值为0,如果将一个负数赋给它,例如unsigned int i = -1;那么按照二进制码的表示方式,其不存在符号位,它会表示成一个较大的数。

有符号整数的溢出

有符号整数是用二进制补码的形式存储的,它的表示是二进制码按位取反然后+1。计算机会根据数的二进制补码表示来计算,如果存在溢出现象,则计算出的值会是一个错误值。

溢出的三种情况

以下来源于整数溢出
a.有符号整数之间的比较

从汇编中可以看到,当两个有符号整数比较大小时 ,是将两数作差,若结果为正则显示被减数大,若结果为负则显示减数大。

当两个有符号整数作差时出现上溢或下溢时,比较结果会与事实相反。

例如,short类型的32767与-5比较大小时,由例1可知,在计算机中,short类型的32767-(-5) =-32764<0,从而得出32767<-5的错误结论。

b.有符号整数的运算

当两个有符号整数运算时,有可能发生上溢或者下溢。

c.无符号整数和有符号整数的比较(运算)

当无符号整数和有符号整数进行比较或运算时,会将有符号整 数转化成无符号整数之后进行比较或运算,从而导致上溢下溢 以及与事实相反的结论。

例如,short类型的-5与unsigned short类型的13比较大小 时,-5转化成无符号整数后等于65531>13,与事实相反。

解决方案

int reverse(int x) //从个位开始考虑
{
    int rev = 0;

    while (x)
    {
        int pop = x % 10;  //依次得到个、十、百、千、万...位上的值
        x = x / 10;  

        if (rev > INT_MAX / 10 || rev == INT_MAX/10 && pop > 7)
            return 0;
        if (rev < INT_MIN / 10 || rev == INT_MIN/10 && pop < -8)
            return 0;
        rev = rev * 10 + pop;
    }
    return rev;
}

代码分析

对于代码中判断整数溢出的条件,依据如下:

INT\_MAX=(INT\_MAX/10)*10+INT\_MAX \% 10

以下来自于C / C ++和应用程序中的INT_MAX和INT_MIN

大多数时候,在竞争性编程中,需要分配数据类型可以容纳的变量,最大值或最小值,但是记住如此大而精确的数字是一项困难的工作。因此,C 有一些宏来表示这些数字,因此可以直接将这些宏分配给变量,而无需实际输入整数。

INT_MAX是一个宏,指定整数变量不能存储超出此限制的任何值。
INT_MIN指定整数变量不能存储低于此限制的任何值。

INT_MAX和INT_MIN的值可能不同,取决于编译器的具体实现。
以下是编译器中整数的典型值,使用32位存储。

INT_MAX的值为+2147483647。
INT_MIN的值为-2147483648。

因为是对整数x中的个十百千万等等位的个数进行循环,有几位就循环几次,所以时间复杂度为O(log(x)),每一个x大概有log_{10}(x)位。空间复杂度为O(1)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335