题目 :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 };
说明一下:源码可能相对其他作者的要长一些,但运行时间还较为理想。
此代码的运行时间:
时间分布:
非常欢迎和大家一起交流!
时间: 2024-12-28 11:56:45