X

曜彤.手记

随手写写,关于互联网技术、产品与创业

LeetCode 每日一题 - 7. Reverse Integer


LeetCode 每日一题系列,今天第十四题。今天这道题既可以看成是一道字符串的题目,也可以看成是一道数学相关的题目。两种解题方法对应着两种不同的思路,要学会从不同的角度去思考问题。建议先看原题的链接自己做一下,然后再参考本文给出的分析与解答进行总结。【Math】

7. Reverse Integer

Reverse digits of an integer.

For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

Example:

Example1: x = 123, return 321

Example2: x = -123, return -321

0. 题目大意:

给定一个数字,求将该数所有位上的数倒序排列后新生成的数,新数和原数的正负性保持不变。

注意:如果新数的大小不在 Int 类型的范围内(过大或过小)则返回数字0。

1. 第一种方法,当做字符串:

思路很简单,首先将给定的数字转换成字符串,然后再将该字符串分割转换成字符数组。此时使用我们常用的“双指针”法将数组内的所有元素倒序排列,再转换成整数类型即可。不要忘记检测转换之后的整数是否有溢出的问题,这里直接使用 try...catch 语句来检查是否有 NumberFormatException 异常出现。代码如下所示:

public static int reverse(int x) {
    // 保存原数字的正负符号;
    int flag = (x > 0) ? 1 : -1;
    int result = 0;

    // 取绝对值;
    x = Math.abs(x);

    // 开始拆分;
    String temp = String.valueOf(x);
    char [] tempChar = temp.toCharArray();

    // 用双指针方法“倒序”排列原数字;
    for (int i = 0; i < tempChar.length; i++) {
        int j = tempChar.length - i - 1;

        if(i >= j)
            break;

        char tempInt = tempChar[i];
        tempChar[i] = tempChar[j];
        tempChar[j] = tempInt;
    }

    try {
        result = Integer.parseInt(String.valueOf(tempChar)) * flag;
    } catch (NumberFormatException e) {  // 如果遇到溢出,则返回0;
        return 0;
    }

    return result;
}
1032 / 1032 test cases passed.
Status: Accepted
Runtime: 6 ms

2. 第二种方法,当做数字:

第二种方法的思路同样也十分简单,既然传进来的是一个数字那么我们就直接把它当做数字来处理。将数字循环除10来获得各个分位上的数字,最后再将各个分位的数字乘以对应的10的幂次(注意低分位应该乘以高分位对应阶数的10的幂)重新相加即可。代码如下所示:

public static int reverseOptimize(int x) {
    // 保留正负性;
    int flag = (x > 0) ? 1 : -1;

    // 取绝对值;
    x = Math.abs(x);
    String temp = String.valueOf(x);

    // 获得数字位数;
    char [] tempChar = temp.toCharArray();
    int bitLen = tempChar.length;
    int i = 1;
    long container = 0;

    // 循环次数为位数;
    while (i <= bitLen) {
        int bit = x % 10;  // 取出该位;
        container = (long)(container + bit * Math.pow(10, bitLen - i++)); // 用一个 Long 型变量来存储最后的值(防止溢出);

        // 溢出则返回0;
        if (container > Integer.MAX_VALUE || container < Integer.MIN_VALUE)
            return 0;

        x = x / 10;
    }

    return (int) container * flag;
}
1032 / 1032 test cases passed.
Status: Accepted
Runtime: 4 ms


这是文章底线,下面是评论
  暂无评论,欢迎勾搭 :)