题目要求:

给出一个32位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123输出: 321

示例 2:

输入: -123输出: -321

示例 3:

输入: 120输出: 21

示例 4:

输入:9646324351输出: 0

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [2的31次方, 2的31次方 1]。

请根据这个假设,如果反转后整数溢出那么就返回 0。

解决方案1:

最low的方法

思路:

转换成字符串。获取最后第一位和最后一位。用于判断是否是负数和是否是0

然后在进行判断,根据情况不同进行判断处理。

如下代码:

public int reverse(int x) {String strX = Integer.valueOf(x).toString(); char [] charArr = strX.toCharArray(); int length = charArr.length; String [] strArr = new String [length]; for(int i =0;i0;i--){ index++; String str = strArr[i]; newStrArr[index] = str; } }else if("0".equals(lastStr)){ newStrArr = new String [length-1]; for(int i= length-2; i >=0;i--){ String str = strArr[i]; newStrArr[index] = str; index++; } }else if("-".equals(fasterStr)){ newStrArr[0] = fasterStr; for(int i= length-1; i >0;i--){ index++; String str = strArr[i]; newStrArr[index] = str; } }else{ for(int i= length-1; i >=0;i--){ String str = strArr[i]; newStrArr[index] = str; index++; } } String str = ""; for(int i = 0;i

此方案运行结果:

运行9毫秒,消耗内存35.4M

解决方案二:

从数学思维来处理的。

例如:1234 反过来就是4321

也就是个位和千百位互换、十位和百位互换。

这些明白了吧。也就是10的x方+Y%10.

其中x是位数。Y是数据。

看懂上面的,我们就能得到下面代码:

public int reverse2(int x) {//用数学思维来看 int rpc = 0; while (x != 0) { int newrpc = rpc*10 + x%10; log.info("rpc*10:{},x%10:{},newrpc:{}",(rpc*10),x%10,newrpc); if ((newrpc - x%10)/10 != rpc){ return 0; } rpc = newrpc; x = x/10; } log.info("==:{}",rpc); return rpc;}

运行后打印日志:

我们在来看看此方案执行结果:

耗时3毫秒,内存消耗:34.3M

再来看第三种解决方案:

思路:使用字符串的反转方法。当溢出的时候异常直接返回0

public int reverse3(int x) {try { if(x > 0) { StringBuilder str = new StringBuilder().append(x); return Integer.parseInt(str.reverse().toString()); }else { StringBuilder str = new StringBuilder().append(-x); return Integer.parseInt(str.reverse().toString())*(-1); } }catch (NumberFormatException e) { return 0; }}

此方案运行结果:

方案4:

使用了math函数、位运算及字符串反转的

public int reverse4(int x){//区域 右端点 double start = Math.pow(2, 31) - 1; //区域 左端点 double end = -Math.pow(2, 31); if(xstart){ return 0; } //获取原始数字符号 float df = Math.signum(x); Integer intDf = Math.round(df); // 取绝对值 int i = Math.abs(x); //使用sring的反转方式 StringBuilder str = new StringBuilder().append(i).reverse(); x = Integer.parseInt(str.toString()); log.info("==>:{}",x*intDf); return x*intDf ;}

执行结果:

方案五:

使用的是位移运输和math函数。

public int reverse5(int x) {int res = 0; int of = ((1 << 31) - 1) / 10; while (x != 0) { if (Math.abs(res) > ((1 << 31) - 1) / 10){ return 0; } res = res * 10 + x % 10; x /= 10; } return res;}

执行结果:

我们将5种方案进行对比:

发现第二种和第五种方案耗时最短。也就是使用数学思路和位移运行最快。

经过五中方案比较之后,我们是不是体会到:编程是一门艺术了。

本文出处:凯哥Java(kaigejava)

好了,今天小算法就到这里了。《每天一个小算法》希望直接可以坚持下去。

java 如何将数字倒置_每日一个小算法之整数中每位上的数字进行反转 20190810相关推荐

  1. C++ leetcode 7. 整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

    一.思路 转化成string, 有负号先去掉负号,然后从string的尾部开始遍历,每一个字符放到第一个另一个字符串中去. int reverse(int x) {if (x == 0)return ...

  2. [每日一个小算法]报童问题

    某报童以每份0.03元的价格买进报纸,以0.05元的价格售出,根据长期统计,报纸每天的销售量及百分率为 销售量 200     210     220     230     240     250 ...

  3. 输出所有的水仙花数,水仙花数是指一个三位数,它的每位上的数字的3次幂之和等于它本身。例如:1*1*1+5*5*5+3*3*3=153

    #include <stdio.h> int main() { int p,q,r,i; printf("水仙花数有:\n"); for(i=100;i<=999 ...

  4. Java黑皮书课后题第8章:*8.2(求矩阵对角线元素的和)使用下面的方法头编写一个方法,求n*n的double类型矩阵中主对角线上所有数字的和。编写一个程序,读取一个4*4的矩阵,显示主对角线和

    *8.2(求矩阵对角线元素的和)使用下面的方法头编写一个方法,求n*n的double类型矩阵中主对角线上所有数字的和.编写一个程序,读取一个4*4的矩阵,显示主对角线和 题目 题目描述与运行示例 破题 ...

  5. 2021-12-19:找到所有数组中消失的数字。 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums

    2021-12-19:找到所有数组中消失的数字. 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内.请你找出所有在 [1, n] 范围内但没有出现在 nums ...

  6. 输入一个正整数,统计整数中各位数字值为零的个数,并把该整数中各位上最大的数字值找出和零的个数组成一个新数字输出

    /*** 输入一个正整数,统计整数中各位数字值为零的个数,并把该整数中各位上最大的数字值找出和零的个数组成一个新数字输出*/import java.util.Scanner;public class ...

  7. Java实现求出所有的水仙花数,水仙化数为3位数,并且每位上的数字的立方和等于该数本身

    public class Main {/*** @author jadexu* @// TODO: 2020/12/26* 求出所有的水仙花数,水仙化数为3位数,并且每位上的数字的立方和等于该数本身* ...

  8. 编程输出所有的“水仙花数”。所谓水仙花数,是指一个3位数,其各个数位上的数字立方和等于该数本身。

    编程输出所有的"水仙花数".所谓水仙花数,是指一个3位数,其各个数位上的数字立方和等于该数本身.例如:153=13+53+33 运行结果示例: 水仙花数有   153  370  ...

  9. 编写程序数一下 1到 100 的所有整数中出现多少次数字9_C语言编写

    编写程序数一下 1到 100 的所有整数中出现多少次数字9: 数: 9 19 29 39 49 59 69 79 89 9091 92 93 94 95 96 97 98 99 个位上的数是9:i % ...

最新文章

  1. 过滤器实例——字符编码Filter
  2. python开发环境配置_百度资讯搜索_python开发环境配置
  3. 牛客题霸 [两个链表的第一个公共结点] C++题解/答案
  4. Android加载大图片不OutOfMemoryError
  5. linux内核启动过程5:启动用户空间
  6. 【实践】微博推荐算法实践与机器学习平台演进.pdf(附PPT下载链接)
  7. 腾讯,360,华为等应用市场相继发布适配公告,发力安卓P版本
  8. linux服务器上已安装R 用户下载R包,服务器R语言包下载、R包离线安装
  9. 实现xtrabackup全量备份与全量恢复
  10. 手算KMP算法next数组
  11. IC验证笔试题(寒武纪)
  12. CG Tools 工具收集
  13. Java发送http的get、post、put请求
  14. 联想计算机boss设置,联想电脑bios设置图解教程
  15. SQL语法之 CHECK 约束
  16. E - 可惜明年花更好,知与谁同? SCU - 4576
  17. OJ每日一练——求平均年龄
  18. 图像去噪之 Noise2Noise 和 Noise2Void
  19. java中自动递增和递减
  20. 关于utc时间与格林威治时间(linux上获取系统时区及代码)

热门文章

  1. 转 从红帽、GitHub和Docker看开源商业模式的进阶
  2. 09.07 jQuery 随意整理
  3. ASP.NET MVC中在 @RenderBody() 或者 @Html.Partial()中需要使用引入外部js,css
  4. python 发送邮件附件及文字信息
  5. (转)一段挺好的领导者应该记得的话
  6. linux的常用操作——C库函数和系统函数的关系
  7. Unity3D-相关函数功能
  8. Leetcode--150. 逆波兰表达式求值
  9. 公交换乘系统c语言,公交换乘的简单实现(源码)
  10. java大数模板_java大数模板