Reverse Integer 2015年6月23日

题目:

Reverse digits of an integer.

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

思路:递归

解答:

1032 / 1032 test cases passed.
Status: Accepted
Runtime: 340 ms
Submitted: 0 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++程序

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

 

class Solution {
public:
    int reverse(int x) {
        long result = 0;
        while(x != 0)
        {
            result = result*10 + x % 10;
            x /= 10;
        }
        return (result > INT_MAX || result < INT_MIN)? 0 : 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);          
     }
    
}

效果:

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

分析:

Reverse Integer :
以整形数字12345为例:

第1次循环:
x=12345
result = 5

第2次循环:
x=1234
result = 5*10+4 = 54

第3次循环:
x=123
result = (5*10+4)*10+3 = 543

第4次循环:
x=12
result = ((5*10+4)*10+3)*10 + 2 = 5432

第5次循环:
x=1
result = (((5*10+4)*10+3)*10 + 2)*10 + 1 = 54321

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

 

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

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

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

posted @ 2015-06-23 16:59  疾风剑  阅读(148)  评论(0编辑  收藏  举报