LeetCode_007_整数反转

题目描述

  1. 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
  2. 示例 1:
  3. 输入: 123
  4. 输出: 321
  5. 示例 2:
  6. 输入: -123
  7. 输出: -321
  8. 示例 3:
  9. 输入: 120
  10. 输出: 21
  11. 注意:
  12. 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 1]。请根据这个假设,如果反转后整数溢出那么就返回 0
  13. 来源:力扣(LeetCode
  14. 链接:https://leetcode-cn.com/problems/reverse-integer
  15. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

总体分析

题目中要求将一个有符号整数进行反转,通过题目给出的例子,需要注意以下几点:

  1. 整数会有负数的情况,反转后符号不变。

  2. 只能存储 32 位有符号整数,取值范围为:-2147483648 ~ 2147483647。超过此范围即为溢出。如果反转后发生了溢出情况,返回 0。

  3. 要反转的数字最后一位是 0 的情况反转过来后要将 0 舍弃。

    • 如题目中的这个例子:120 --> 21。

解决方案

思路分析:

首先,先分析溢出问题,对于题目中要求的 32 位有符号整数,其实也就是 int 类型,相对应的取值范围为:-2147483648 ~ 2147483647。那么发生溢出的情况就是反转过来的数不在这个范围内。

举个例子:将 2111222239 反转过来后为 9322221112,此时这个数超过了上面的范围,这个情况就是溢出,此时返回 0 即可。

接着,分析转换的数是负数时的情况:如果要转换的数是负数,就先取其绝对值将其反转后再将结果转换为负数返回即可。

综上,可以设计解题流程如下,假设要转换的数为 x:

  1. 首先判断 x 是否为 -2147483648,如果是返回 0,防止取 x 绝对值 -x 时报错。

  2. 判断 x 是否为负数,如果是负数则先取其绝对值然后递归取反,最后将结果转换为负数。

  3. 使用一个变量 result 保存结果,初始时为 0。

  4. 对 x 取反时将 x % 10 依次取出最后一位数(例如: 256 % 10 = 6)放置到 result 中(即 result * 10 + x % 10),最后将 x / 10。依次进行此过程即可将 x 反转。

  5. 在取反过程中需要注意的是要进行该判断:if (result > 214748364) 进行提前判断溢出处理。

    举个例子说明:

    1463847412 反转后为 2147483641,此时当反转到 214748364 时,还没有大于,所以没有溢出。如果 result > 214748364 说明反转后就已经溢出了。

    例如:1563847412 -> 2147483651,当反转到 214748365 时,由于大于了 214748364,所以可以提前判断溢出。

  6. 判断 result 是否溢出,如果溢出返回 0,否则返回反转后的结果,这里判断溢出是因为前面的提前判断溢出不能判断到最后一位,如果最后一位加的数超过溢出值的话就会产生溢出,所以需要判断。不好理解的话可以结合下面代码进行理解。

根据以上思路,可设计题解代码如下:

  1. /**
  2. * 整数反转解题方案
  3. *
  4. * @author 踏雪彡寻梅
  5. * @date 2020/2/6 - 12:14
  6. */
  7. class Solution {
  8. public int reverse(int x) {
  9. if (x == -2147483648) {
  10. // 做此判断防止取 x 绝对值时 x = -x 报错
  11. return 0;
  12. }
  13. if (x < 0) {
  14. // 如果为负数,取其绝对值调用自己然后将结果转为负数
  15. return -reverse(-x);
  16. }
  17. // 用于保存结果返回
  18. int result = 0;
  19. // 取反操作
  20. while (x != 0) {
  21. if (result > 214748364) {
  22. // 处理溢出
  23. // 举例:1463847412
  24. // 反转后:2147483641
  25. // 此时当反转到 214748364 时,还没有大于,所以没有溢出
  26. // 如果 result > 214748364 反转后就已经溢出了
  27. // 例如:1563847412 -> 2147483651
  28. // 当反转到 214748365 时,由于大于了 214748364,所以可以提前判断溢出
  29. return 0;
  30. }
  31. // 接收取反结果
  32. result = result * 10 + x % 10;
  33. x /= 10;
  34. }
  35. // 如果溢出就返回 0
  36. // 防止提前判断溢出不能判断到最后一位的情况,如果最后一位加的数超过溢出值的话就会产生溢出
  37. return result <= 2147483647 ? result : 0;
  38. }
  39. }

提交结果:

提交后时间上和空间上的结果还是效果蛮好的O(∩_∩)O。接下来进行一些简单的时间复杂度和空间复杂度分析。

时间复杂度简单分析:

对于时间复杂度则是分析 while 循环中的代码,因为这块代码占据了程序的时间是最多的。

  1. while (x != 0) {
  2. if (result > 214748364) {
  3. return 0;
  4. }
  5. result = result * 10 + x % 10;
  6. x /= 10;
  7. }

从以上代码可以看出,x 每循环一次就除以 10,直到 x = 0 时或者 result 溢出时才结束循环。这里假设 result 不溢出的情况来进行分析:

对于 x / 10 判断 x 是否等于 0 其实可以看为:x 除了几次 10 才等于 0。这里假设这个次数为 n。

用式子表达也就是:x / 10 / 10 / 10 / ... / 10 = x / 10n = 0,即可以表示为 x = 10n

也就是说明,程序的运行时间主要跟 n 相关,所以需要将 n 计算出来:

通过 x = 10n 求解 n 这个问题在高中时就已经学过了,即 n = log10x。

所以,时间复杂度为 O(log10x) = O(lgx)。

空间复杂度简单分析:

空间上使用了一个 result 整型变量用来辅助接收结果,每次赋值分配的空间都是常数级别的,所以空间复杂度为 O(1)。

小结

解题时需要注意特殊情况:为负数的情况、尾部为 0 的情况以及整数溢出的情况。

如有写的不足的,请见谅,请大家多多指教。

详解 LeetCode_007_整数反转(Java 实现)的更多相关文章

  1. Java 集合详解 | 一篇文章解决Java 三大集合

    更好阅读体验:Java 集合详解 | 一篇文章搞定Java 三大集合 好看的皮囊像是一个个容器,有趣的灵魂像是容器里的数据.接下来讲解Java集合数据容器. 文章篇幅有点长,还请耐心阅读.如只是为了解 ...

  2. Hibernate(或其它ORM)里的inverse用法详解,内容摘自Java web轻量级开发面试教程

    本文来是从 java web轻量级开发面试教程从摘录的. Inverse的英文含义是反转,在Hibernate中用来决定是由哪方来维护两个业务实体类之间的关联关系,具体而言,就是由哪方去设置这个被外键 ...

  3. 详解Maven项目利用java service wrapper将Java程序生成Windows服务

    在项目的开发中,有时候需要将Java应用程序打包成Windows服务,我们就直接可以通过windows的服务来启动和关闭java程序了. 本博文将通过有两种方法实现该功能,手动创建法和Maven自动打 ...

  4. LeetCode刷题 1. Two Sum 两数之和 详解 C++语言实现 java语言实现

    1. Two Sum 两数之和 Given an array of integers, return indices of the two numbers such that they add up ...

  5. Java基础详解 (一)Java的类成员访问权限修饰词(以及类访问权限)

    在一个类的内部,其成员(包括成员变量和成员函数)能否被其他类所访问,取决于该成员的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下),protected和public.其权 ...

  6. JAVA本地方法详解,什么是JAVA本地方法?

    一. 什么是Native Method   简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非j ...

  7. 黑马程序员 Java正则表达式,详解反斜线在Java中的作用

    ---------------------- ASP.Net+Android+IO开发S. .Net培训.期待与您交流! ---------------------- 在程序设计过程中,经常需要对获取 ...

  8. 【详解】JNI(Java Native Interface)(一)

    前言: 一提到JNI,多数编程者会下意识地感受到一种无法言喻的恐惧.它给人的第一感觉就是"难",因为它不是单纯地在JVM环境内操作Java代码,而是跳出虚拟机与其他编程语言进行交互 ...

  9. jdbc连接池中c3p0的配置文件的详解以及在在java中如何使用

    <c3p0-config> <!-- 默认配置,如果没有指定则使用这个配置 --> <default-config> <property name=" ...

随机推荐

  1. NMS系列

    NMS soft NMS softer NMS https://www.cnblogs.com/VincentLee/p/12579756.html

  2. Linux探测工具BCC(网络)

    Linux探测工具BCC(网络) 承接上文,本节以ICMP和TCP为例介绍与网络相关的部分内容. 目录 Linux探测工具BCC(网络) Icmp的探测 TCP的探测 Icmp的探测 首先看下促使我学 ...

  3. C#LeetCode刷题之#345-反转字符串中的元音字母​​​​​​​(Reverse Vowels of a String)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3935 访问. 编写一个函数,以字符串作为输入,反转该字符串中的元 ...

  4. 【工具】OSS阿里云存储服务--超级简单--个人还是觉得Fastdfs好玩

    介绍 阿里云对象存储服务(Object Storage Service,简称 OSS)为您提供基于网络的数据存取服务. 使用 OSS,您可以通过网络随时存储和调用包括文本.图片.音频和视频等在内的各种 ...

  5. JavaScript中的正则表达式详解

    摘要:javascript中的正则表达式作为相当重要的知识,本文将介绍正则表达式的相关知识和用法. 正则表达式(Regular Expression)是一门简单语言的语法规范,是强大.便捷.高效的文本 ...

  6. SpringMVC使用Session

    Session在用户登录,一些特殊场合在页面间传递数据的时候会经常用到 @ 目录 修改IndexController check.jsp 效果 修改IndexController 映射 /check ...

  7. Kafka API实战

    第4章 KafkaAPI实战 1)启动zk和kafka集群,在kafka集群中打开一个消费者 [hadoop102 kafka]$ bin/kafka-console-consumer.sh \ -- ...

  8. ClickHouse 参数配置

    转载自:https://xw.qq.com/cmsid/20200806A0PQ7X00?ADTAG=amp 在 ClickHouse 进程中,CPU 的主频越高越好,通常建议使用 32 以上的机型, ...

  9. 12c RAC 用Rman 恢复到异机单实例

    准备工作 原服务器软件部署:Redhat 6.6 + Oracle 12.2.0.1 rac Oracle12c单实例安装 1.创建恢复服务器,设置大于原库数据大小的磁盘容量.设置相同的服务器主机名参 ...

  10. 通过自定义资源扩展Kubernetes

    原文链接:通过自定义资源扩展Kubernetes