题解 | #反转数字#

反转数字

http://www.nowcoder.com/practice/1a3de8b83d12437aa05694b90e02f47a

算法思想一:直接法

解题思路:

1、如果数字 x 在【-10,10】之间则直接返回 x,因为一个数字反转之后还是其本身
2、将数字 x 转换为字符串 str_x
3、根据 字符串 str_x 首位判断该数字是正数还是负数
    1、字符串 str_x[0] == '-',为负数,则对字符串(去除首位符号)反转 str_x = str_x[:0:-1],反转之后转为数字(负数)
    2、当为正数时,直接对字符串进行反转 str_x = str_x[::-1],再转换为数字
4、判断反转后的数字是否在 [-2^31, 2^31-1]区间内,若在区间内则直接返回反转后的数字,否则返回0

代码展示:

Python版本
class Solution:
    def reverse(self , x ):
        # write code here
        if -10 < x < 10:
            return x
        str_x = str(x)
        # 区分正负数
        if str_x[0] != "-":
            str_x = str_x[::-1]
            x = int(str_x)
        else:
            str_x = str_x[:0:-1]
            x = int(str_x)
            x = -x
        # 判断反转后的数字是否越界
        return x if -2147483648 < x < 2147483647 else 0

复杂度分析

时间复杂度O(N):N表示数字的位数,需要遍历反转
空间复杂度O(N):数字转为字符串占用空间

算法思想二:数学法

解题思路:

1、通过循环将数字 x 的每一位拆开,在计算新值时每一步都判断是否溢出。
2、溢出条件有两个,一个是大于整数最大值MAX_VALUE,另一个是小于整数最小值MIN_VALUE,设当前计算结果为ans,下一位为pop。
3、从ans * 10 + pop > MAX_VALUE这个溢出条件来看
    1、当出现 ans > MAX_VALUE / 10 且 还有pop需要添加 时,则一定溢出
    2、当出现 ans == MAX_VALUE / 10 且 pop > 7 时,则一定溢出,7是2^31 - 1的个位数
4、从ans * 10 + pop < MIN_VALUE这个溢出条件来看
    1、当出现 ans < MIN_VALUE / 10 且 还有pop需要添加 时,则一定溢出
    2、当出现 ans == MIN_VALUE / 10 且 pop < -8 时,则一定溢出,8是-2^31的个位数
上图绿色的是最大32位整数
第二排数字中,橘子的是5,它是大于上面同位置的4,这就意味着5后跟任何数字,都会比最大32为整数都大。
所以,我们到【最大数的1/10】时,就要开始判断了
如果某个数字大于 214748364那后面就不用再判断了,肯定溢出了。
如果某个数字等于 214748364呢,这对应到上图中第三、第四、第五排的数字,需要要跟最大数的末尾数字比较,如果这个数字比7还大,说明溢出了

上图中绿色部分是最小的32位整数,同样是在【最小数的 1/10】时开始判断
如果某个数字小于 -214748364说明溢出了
如果某个数字等于 -214748364,还需要跟最小数的末尾比较,即看它是否小于8

代码展示:

JAVA版本
import java.util.*;


public class Solution {
    /**
     * 
     * @param x int整型 
     * @return int整型
     */
    public int reverse (int x) {
        // write code here
        int ans = 0;
        while (x != 0) {
            int pop = x % 10;
            if (ans > Integer.MAX_VALUE / 10 || (ans == Integer.MAX_VALUE / 10 && pop > 7)) 
                return 0;
            if (ans < Integer.MIN_VALUE / 10 || (ans == Integer.MIN_VALUE / 10 && pop < -8)) 
                return 0;
            ans = ans * 10 + pop;
            x /= 10;
        }
        return ans;
    }
}

复杂度分析

时间复杂度O(N):N表示数字的位数,需要遍历反转
空间复杂度O(1):常数级空间

全部评论

相关推荐

03-24 13:24
已编辑
江西农业大学 后端工程师
最近或许大家都听说xxxx厂裁员,无论前端,后端,大数据,测试,运维,人人可危,&nbsp;“前端死了,后端也死了,JAVA崩盘了,你们这群搞大模型的真是码奸”这次AI真的会让我们无路可走吗????????太阳底下已经没有新鲜事了旧的生产力的消失,必然有新的生产力诞生马车夫消失&nbsp;→&nbsp;汽车司机、修车工、石油工业诞生,从业人数是马车夫的百倍手工纺织女工消失&nbsp;→&nbsp;纺织机械工程师、面料设计师诞生,纺织品产量提升百倍2007年苹果开放&nbsp;App&nbsp;Store,&quot;移动端开发者&quot;这个职业压根不存在。八年后,全球应用经济规模突破&nbsp;1000亿美元,凭空诞生了数百万开发者岗位。每一次&quot;这次真的完了...
二十岁的编程男神王大...:那这个时代是什么时代呢? 是全员agent的时代,是前端+AI,后端+AI的时代,AI已经融入了项目生命周期的的每一个角落,那我最近在做的东西举例,检查BUG时,我们会用codex,CC等工具的skill去check,效果好还能直接fix,测试的时候,apifox等工具已经有了AI落地的改造,CI/CD阶段,我们会根据hook去跑AI check脚本,就连不少中间件,也迎来了AI落地的改造,(AI网关,AI在MQ中的运用),都可以去了解下 另外记着,这些东西不是意义,工作只是谋生的一个手段,ai是让开发提效了,但是呢,原先一周的工作流程压缩到了两天内,同时低级的都裁员了,只有高级的去维护,你看似写的大义凛然,或许那天你也会成为你文章里面拒绝往前走的人,你才大二,面对技术有热情是对的
AI求职实录
点赞 评论 收藏
分享
评论
8
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务