码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode(7): Reverse Integer 源码实现 runtime: 8ms

时间:2015-08-04 00:24:22      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

题目 :Reverse Integer

Reverse digits of an integer.

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

题目分析及部分代码解析:

1、需要考虑一位数,比如1,2,3等特殊情况,返回本身。

2、需要考虑0,返回0.

3、需要考虑如123000,45600等末尾有若干零的情况,正确结果应为321、654,不应该出现000321,00654等情况。

4、需要4字节int类型数据的取值范围:-2147483648 ~ 2147483647 。注意,中间位数倒转是也会出现溢出,比如:1234567898,第一次倒转为

     80000000000,第二次倒转为8900000000,其实第一次倒转已经溢出,在中间的choose变量加一句条件判断即可。

源码里的注释写得还较详细,可以直接看源码:

 1 class Solution {
 2 public:
 3     int reverse(int x) {
 4         
 5         long long result = 0; //result为结果保存变量
 6         int label = 1;            //label为输入x每一位的中间保存变量,比如x=123,label=3,2,1                
 7         int temp1 = 0;         //temp1为临时变量,用于计算输入x的位数
 8         int len=0;                //len为输入x的位数,比如x=123,len=3   
 9         int mi = 1;               //mi为每一位需要的幂次
10         if (x==0)                 //x为0,直接返回0
11             return 0;
12         if (x/10 == 0)         //x为一位数,返回本身
13             return x;
14        
15         temp1 = x;             
16 
17         while(temp1/10 != 0)   //计算x的位数
18         {
19             ++len;
20             temp1 = temp1/10;
21         }
22         ++len;
23         
24         while (x%10 == 0 )     //特殊情况:如果x=123000,45600,则结果应为321,654,利用此循环去除后面的多余0
25         {      
26             x = x/10;
27             len--;
28          }
29              
30         int k = len;               //此时len为去除末尾若干0的实际位数,k位后续的循环次数
31 
32         long long choose = 0;  //choose用判断中间位数倒转后是否超过取值范围,比如x=1234567898, 则第一次的中间倒转choose = 8000000000已经超值,需要返回0
33 
34         for (int i=0; i<k; i++)
35         {
36             label = x%10; //取此时末尾一位数
37             
38             for (int m=0;m<len-1;m++)   //计算此时的末尾数需要乘的幂数
39             {
40                 mi = mi*10;
41             }
42 
43             choose = mi;  
44         choose = label*choose; 
45 
46         if (choose > INT_MAX || choose < INT_MIN) //判断中间倒转是否超值
47                 return 0;
48 
49             result = result + choose; //进行累加,得到结果result
50 
51             if (result >INT_MAX || result <INT_MIN) //result超值,也需返回0
52                 return 0;
53             
54             len--; //更新len
55             mi = 1; //将mi置1,为下一位的幂数计算做准备
56             x = x/10;  //更新x , 比如x = 123 ->>> x =12 ->>>x =1
57             
58         }  
59             
60         return (int)result;    //返回最终结果,需要将类型强制转换为int类型                     
61     }
62 };

说明一下:源码可能相对其他作者的要长一些,但运行时间还较为理想。

此代码的运行时间:

 

技术分享

时间分布:

技术分享

非常欢迎和大家一起交流!

leetcode(7): Reverse Integer 源码实现 runtime: 8ms

标签:

原文地址:http://www.cnblogs.com/michaelleong/p/4700560.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!