X

曜彤.手记

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

  1. 7. Reverse Integer:

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



评论 | Comments


Loading ...