Reverse Integer 2015年6月23日

时间:2023-03-08 18:44:04

题目:

Reverse digits of an integer.

Example1: x = , return
Example2: x = -, return -

思路:递归

解答:

 /  test cases passed.
Status: Accepted
Runtime: ms
Submitted: minutes ago

这个方法比较糟糕,时间太长用到递归但又没利用函数的返回值,中间还需要借助字符串过渡。

public class Solution {
StringBuilder result = new StringBuilder("");
public int reverse(int x) {
//Integer.MIN_VALUE 会引起各种麻烦
if(x == Integer.MIN_VALUE){
return 0;
}
if(x >= 0){
if ( x == 0)
return 0;
else
{
result.append(x%10);
reverse(x/10);
} }else{
if ( x == 0)
return 0;
else
{
result.append(Math.abs(x)%10);
reverse(x/10);
}
} if( Long.parseLong(result.toString())-Integer.MAX_VALUE>0){
return 0;
}else{
if(x<0){
return 0-Integer.parseInt(result.toString());
}else{
return Integer.parseInt(result.toString());
}
} }
}

看到一个8ms的C++程序

 /  test cases passed.
Status: Accepted
Runtime: ms
Submitted: minutes ago
class Solution {
public:
int reverse(int x) {
long result = ;
while(x != )
{
result = result* + x % ;
x /= ;
}
return (result > INT_MAX || result < INT_MIN)? : result;
}
};

改成JAVA版

public class Solution {
public int reverse(int x) {
long result = 0;
while(x != 0)
{
result = result*10 + x % 10;
x /= 10;
}
return (int) ((result > Integer.MAX_VALUE || result < Integer.MIN_VALUE)? 0 : result);
} }

效果:

 /  test cases passed.
Status: Accepted
Runtime: ms
Submitted: minutes ago

分析:

Reverse Integer :
以整形数字12345为例: 第1次循环:
x=
result = 第2次循环:
x=
result = *+ = 第3次循环:
x=
result = (*+)*+ = 第4次循环:
x=
result = ((*+)*+)* + = 第5次循环:
x=
result = (((*+)*+)* + )* + =

该算法无需区分正符号,显然转化成字符串是一种比较low的想法

可以看到几乎同样的代码,java运行时间要长很多,知乎上给出的解释是java统计时间时把虚拟机的启动时间也考虑在内,所以不同语言之间通过时间来衡量算法优劣是不可取的,用java语言也没必要纠结于此

另外,本可不用字符串的一定要杜绝字符串的使用,因为其它语言的字符串并不像java这么方便,要考虑代码的通用性

另外还发现java语言的代码重复运行,时间波动也比较大,这个波动有时都接近100ms!!!