`

每日一个小算法之整数中每位上的数字进行反转 20190810

 
阅读更多

题目要求:

给出一个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;i<length;i++){
       strArr[i] = String.valueOf(new char[]{charArr[i]});

   }
   String [] newStrArr =   new String [length];
   String fasterStr =  strArr[0];
   String lastStr = strArr[length-1];
   int index = 0;
    if("-".equals(fasterStr)
            && "0".equals(lastStr)){
        newStrArr =   new String [length-1];
        newStrArr[0] = fasterStr;
        for(int i= length-2; i >0;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<newStrArr.length;i++){
        str+= newStrArr[i];
    }
   try{
       if(""!= str && null != str){
           Integer ix = Integer.parseInt(str);
           x=ix.intValue();
       }
   }catch (Exception e){
        return 0;
   }

    return  x;
}

此方案运行结果:

 

 

运行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(x<end && x>start){
        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)

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

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    算法-数字反转(升级版)(洛谷-P1553).rar

    标题中的“算法-数字反转(升级版)(洛谷-P1553)”指的是一个编程挑战,源自知名的在线编程平台洛谷(LeetCode)上的一个问题。洛谷平台以其丰富的算法题目著称,帮助程序员提升算法技能。问题编号P1553表明这是该...

    算法-数字反转(信息学奥赛一本通-T1089).rar

    数字反转是指将一个整数的每一位数字进行逆序排列。例如,数字1234反转后变成4321。这个操作在编程中经常用于处理数值比较、排序或构建新的数字结构。 二、反转方法 1. 字符串操作:将数字转换为字符串,然后使用...

    反置数 1

    一个整数的反置数是指将这个整数的每一位数字顺序颠倒后得到的新整数。例如,整数1234的反置数是4321,整数1200的反置数是21,因为末尾的0在反置过程中会被忽略。 题目要求我们编写一个程序,输入两个整数a和b,...

    NOIP2011年普及组复赛试题第一题《数字反转》测试数据10组

    1. **数字反转**:数字反转是一个常见的编程问题,通常需要将一个整数或浮点数的每一位顺序颠倒。例如,数字1234反转后变为4321。实现方法可以包括将数字转换为字符串,然后通过切片或迭代进行反转,或者通过数学...

    算法-数字反转(洛谷-P1307).rar

    标题中的“算法-数字反转(洛谷-P1307)”是指洛谷平台上的一道编程题目,编号为P1307。洛谷是一个深受程序员喜爱的在线编程平台,它提供了各种难度级别的算法题目供用户挑战,以提升编程能力和算法理解。这道题目...

    Python学习笔记3-整数反转

    这个问题的目的是将一个32位有符号整数的每一位数字进行反转。我们可以通过多种方法实现这一功能,但这里我们将讨论一种简单且高效的方法,类似于反转字符串。 首先,我们需要明确题目要求。给定一个32位的有符号...

    java-leetcode面试题解之第7题整数反转.zip

    题目描述通常简洁明了:给定一个32位有符号整数,你需要设计一个函数来反转这个整数。这意味着将整数的每一位按照相反的顺序排列。例如,如果输入是12345,则输出应该是54321;如果输入是-123,则输出应为-321。 ...

    整数反转1

    这个问题要求我们接收一个32位的有符号整数,并将其每一位数字进行反转。具体来说,我们要将数字的个位变为最高位,十位变为次高位,以此类推,直到整个数字完全反转。 题目给出了几个示例来帮助理解这个问题: 1. ...

    Python3程序设计:数字反转(升级版)

    在Python3程序设计中,"数字反转(升级版)"是一个涉及多种数字类型(整数、小数、分数、百分数)反转问题的算法挑战。这个任务要求编写一个程序,根据给定的数字类型,反转其各个位上的数字,同时遵循特定的规则。 ...

    显示一个整数数字的各位数字

    在编程领域,将一个整数数字分解成各个位上的数字是一项常见的操作,特别是在处理数字相关的算法和用户界面显示时。这个任务涉及到基本的数学运算和字符串处理技术。下面我们将详细探讨如何实现这一功能,以及相关的...

    经典面试题(1):统计整数中1的个数

    本题“经典面试题(1):统计整数中1的个数”是一个典型的例子,其核心是计算一个无符号32位整数在二进制表示下含有多少个1。这个问题在计算机科学中被称为“位操作”或“计数比特”的问题,涉及到位运算、循环以及...

    c#-Leetcode面试题解之第7题整数反转.zip

    给定一个32位有符号整数,你的任务是反转它的每一位数字,然后返回结果。需要注意的是,当反转后的整数溢出时,你需要返回0。例如,输入123,输出321;输入-123,输出-321;输入120,输出21,但输入1534236469,由于...

    C语言--写一个函数,判断一个整数是否为回文数,是返回1,不是返回0(如果一个整数,从左右来读都一样,就称它为回文数

    在C语言中,编写一个函数来判断一个整数是否为回文数是一项常见的编程练习,它可以帮助初学者更好地理解数字处理和字符串操作。回文数是一个可以正向和反向读取都相同的数字,比如12321、111、45654等。下面我们将...

    整数反转(java代码).docx

    对于一个给定的32位有符号整数`x`,需要编写程序使其数字顺序反转。例如,输入为`123`时,输出应为`321`;若输入为`-123`,则输出为`-321`。但是,由于32位整数存在最大值`2^31 - 1`和最小值`-2^31`,因此在反转过程...

    大厂算法面试题库中高频出现的30道典型题.pdf

    2. 将一个32位有符号整数中的数字进行反转。这需要考虑整数反转时的边界问题,比如反转后的结果是否超出了32位整数的表示范围。 3. 实现atoi函数,即将字符串转换成整数。这涉及到字符串的遍历,同时需要注意整数...

    长整数的运算-算法与数据结构课程毕业设计.doc

    1. 双向循环链表的数据结构:在本设计中,使用双向循环链表来存储长整数,每个节点存储四位十进制数字,包括符号位和数据位。头指针的data值存储长整数的符号,1为正,-1为负,0代表长整数为0;over值存储除头节点外...

    c++-c++编程基础之leetcode题解第7题整数反转.zip

    第7题“整数反转”(Integer Reverse)是LeetCode中的一个经典问题,它要求我们编写一个函数,将输入的整数进行翻转。这涉及到C++的基础知识,包括数据类型、操作符以及对整数内部二进制表示的理解。 题目描述: ...

    C语言链表实现大整数乘法

    3. 折半相乘的过程是,将一个数的每一位乘以另一个数,然后根据位值进行累加。这一步需要递归地处理链表。 4. 由于我们对较短的链表进行了反转,所以最后得到的结果是高位在前,低位在后,需要再次反转。 5. 合并...

    算法设计

    关键在于理解如何计算每位数字的出现次数: 1. **前缀计数**:对于当前位i,所有前缀相同且小于当前位的数字出现次数(例如,在数字“123”中,“1”之前的数字个数)。 2. **后缀计数**:对于当前位i,所有后缀...

    数据结构与算法题解

    - 实例问题:实现一个算法对数组中的元素进行随机排序。 - **位操作(BitManipulation)** - 直接对整数的二进制表示进行操作。 - 实例问题:实现一个函数来判断一个整数是否为2的幂。 #### 二、编码实践篇 **1....

Global site tag (gtag.js) - Google Analytics