zoukankan      html  css  js  c++  java
  • 算法学习-整数反转

     

    题目和需求

    给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

    如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

    常规解法

    使用字符串回转方法(一般开发中的思路)

    public static int reverse1(int x) {
            if (x == 0) {
                return 0;
            } else {
                String temp = String.valueOf(x);
                StringBuilder sb = new StringBuilder();
                int length = temp.length();
                if (x > 0) {
                    for (int i = 0; i < length; i++) {
                        sb.append(temp.charAt(length - i - 1));
                    }
                    return Integer.valueOf(sb.toString());
                } else {
                    for (int i = 0; i < length - 1; i++) {
                        sb.append(temp.charAt(length - i - 1));
                    }
                    return -Integer.valueOf(sb.toString());
                }
            }
        }

    这个没有特殊技巧,就是一般实际工作中常见的思路,提出需求你,按需求思路解决需求。

    改进算法

    public int reverse(int x) {
            long n = 0;
            while(x != 0) {
                n = n * 10 + x % 10;
                x = x / 10;
            }
            return (int)n==n? (int)n:0;
        }

    结题思路:

    由于int反转后,可能会超过int最大值,所以使用long存储中间值,最后用强转后对比值大小判断是否有值溢出

    从后往前,每次取到除以10的余数,每次循环一次,将上次所得值乘以10.

    更多限制

    不使用long,使用算数运算避免字符串操作

    public static int reverse(int x) {
            if (x == 0) {
                return 0;
            } else {
                int ret = 0;
                while (x != 0) {
                    int temp = ret;
                    ret = (ret * 10) + (x % 10);
                    if (temp != ret / 10)
                        return 0;
                    x = x / 10;
                }
                return ret;
            }
        }

    注意点:

    if (temp != ret / 10)一定要在加法完成后计算是否越界
    有些算法喜欢直接在上一步就比较是否大于int.maxvalue和小于int.minvalue,这是错的,因为java溢出继续添加,并不会报错,而是会继续进位。
  • 相关阅读:
    Hdu 4221 Greedy?
    Hdu 2955 Robberies
    Hdu 3309 Roll The Cube
    Hdu 2602 Bone Collector
    Hdu 2844 Coins
    Hdu 2255奔小康赚大钱
    Hdu 2120 Ice_cream's world I
    Hdu 2159 FATE
    Hdu 2102 A计划
    Hdu 2098分拆素数和
  • 原文地址:https://www.cnblogs.com/pingpingliao/p/14540791.html
Copyright © 2011-2022 走看看