leetcode第7题

简介: 为什么呢?倒置过来不应该是 9646324351 吗。其实题目里讲了,int 的范围是 [-2^{31} ,2^{31}-1][−2​31​​ ,2​31​​ −1] 也就是 [-2147483648,2147483647][−2147483648,2147483647] 。明显 9646324351 超出了范围,造成了溢出。所以我们需要在输出前,判断是否溢出。问题的关键就是下边的一句了。rev = rev * 10 + pop;为了区分两个 rev ,更好的说明,我们引入 temp 。temp = rev * 10 + pop;rev = temp;我们对 t

image.png

很简单,就是输入整数,输出它的倒置。

第一反应就是, 取余得到个位数,然后除以 10 去掉个位数,然后用一个变量保存倒置的数。

publicintreverse(intx) {
intrev=0;
while (x!=0) {
intpop=x%10;
x/=10;
rev=rev*10+pop;
    }
returnrev;
}

然后似乎不是那么理想。


为什么呢?倒置过来不应该是 9646324351 吗。其实题目里讲了,int 的范围是 [-2^{31} ,2^{31}-1][231,2311] 也就是 [-2147483648,2147483647][2147483648,2147483647] 。明显 9646324351 超出了范围,造成了溢出。所以我们需要在输出前,判断是否溢出。

问题的关键就是下边的一句了。

rev = rev * 10 + pop;

为了区分两个 rev ,更好的说明,我们引入 temp 。

temp = rev * 10 + pop;

rev = temp;

我们对 temp = rev * 10 + pop; 进行讨论。intMAX = 2147483647 , intMin = - 2147483648 。

对于大于 intMax 的讨论,此时 x 一定是正数,pop 也是正数。

  • 如果 rev > intMax / 10 ,那么没的说,此时肯定溢出了。
  • 如果 rev == intMax / 10 = 2147483647 / 10 = 214748364 ,此时 rev * 10 就是 2147483640 如果 pop 大于 7 ,那么就一定溢出了。但是!如果假设 pop 等于 8,那么意味着原数 x 是 8463847412 了,输入的是 int ,而此时是溢出的状态,所以不可能输入,所以意味着 pop 不可能大于 7 ,也就意味着 rev == intMax / 10 时不会造成溢出。
  • 如果 rev < intMax / 10 ,意味着 rev 最大是 214748363 , rev * 10 就是 2147483630 , 此时再加上 pop ,一定不会溢出。

对于小于 intMin 的讨论同理。


publicintreverse(intx) {
intrev=0;
while (x!=0) {
intpop=x%10;
x/=10;
if (rev>Integer.MAX_VALUE/10 ) return0;
if (rev<Integer.MIN_VALUE/10 ) return0;
rev=rev*10+pop;
    }
returnrev;
}


时间复杂度:循环多少次呢?数字有多少位,就循环多少次,也就是 log_{10}(x) + 1log10(x)+1 次,所以时间复杂度是 O(log(x))。

空间复杂度:O(1)。

当然我们可以不用思考那么多,用一种偷懒的方式 AC ,我们直接把 rev 定义成 long ,然后输出前判断 rev 是不是在范围内,不在的话直接输出 0 。

publicintreverse(intx) {
longrev=0;
while (x!=0) {
intpop=x%10;
x/=10;
rev=rev*10+pop;
    }
if (rev>Integer.MAX_VALUE||rev<Integer.MIN_VALUE ) return0;
return (int)rev;
}
相关文章
|
运维 Serverless API
四大软件架构:掌握单体、分布式、微服务、Serverless 的精髓
如果一个软件开发人员,不了解软件架构的演进,会制约技术的选型和开发人员的生存、晋升空间。这里我列举了目前主要的四种软件架构以及他们的优缺点,希望能够帮助软件开发人员拓展知识面。
|
8月前
|
Python
课时14:==和is
本内容介绍Python中`==`和`is`的区别。`==`用于比较对象的值是否相等,而`is`用于比较对象的标识(内存地址)是否相同。例如,两个列表即使内容相同,它们的内存地址也不同,因此`is`会返回`False`,而`==`会返回`True`。选择使用时,通常情况下用`==`,严格比较同一对象时用`is`。
|
Java 测试技术 Maven
maven 打包命令
maven 打包命令
189 6
|
机器学习/深度学习 人工智能 Kubernetes
机器学习PAI报错问题之代码打包后上传报错如何解决
人工智能平台PAI是是面向开发者和企业的机器学习/深度学习工程平台,提供包含数据标注、模型构建、模型训练、模型部署、推理优化在内的AI开发全链路服务;本合集将收录PAI常见的报错信息和解决策略,帮助用户迅速定位问题并采取相应措施,确保机器学习项目的顺利推进。
|
Linux 开发工具 git
Linux系统使用Git仓库安装Nvm工具并安装Npm和Node
Linux系统使用Git仓库安装Nvm工具并安装Npm和Node
820 0
|
数据采集 数据挖掘 Python
python数据分析 - 卡方检验
python数据分析 - 卡方检验
542 0
华为机试HJ73:计算日期到天数转换
华为机试HJ73:计算日期到天数转换
136 0
|
NoSQL 测试技术 Redis
Redis性能测试
Redis性能测试
605 0
|
存储 算法 Java
趣味算法——链表:灵活性与高效性的完美结合
一、链表的独特魅力 1.1 简介和定义 链表(Linked List)是一种常见的基础数据结构,它通过“链接”的方式来存储数据,相当于是把数据分散存放在内存中,每一部分数据由一个存储元素和一个指针组成,其中,存储元素用于保存或者表示数据,指针则用来标记下一个存储元素的地址,这样,将分散的数据链接起来,形成一个完整的数据存储和表示的体系。
251 0
|
关系型数据库 MySQL Linux