您的位置:首页 > 其它

LeetCode之Reverse Integer

2015-09-11 22:25 239 查看

——随记

今天去了ThoughtWorks公司开放日,很激情很年轻化的公司,可能是去的都是本科应届生吧,感觉自己好老……

不过还好我长得还比较年轻,没人发现……嘿嘿

相信自己比他们多吃几年盐,人生阅历上应该是有优势的,更成熟稳定更理解,理解自己理解别人

想要过上和闺蜜一起工作的日子,看来还需要更挑战,谁叫我闺蜜那么牛咧

好好练代码吧~

言归正传

今天的题目用了2个小时写好

仍然是逻辑很快出来,但细节注意的不够,调试了很多遍

不是这里错,就是那里错……

以后要培养用纸笔演示的习惯

不能完全靠debug

class Solution {
public:
int reverse(int x) {
int a[10] = {0};//分解x 至多10位
int r=0;
int j;
int i;
int flag = 0;
int k = 9;//记录原数有多少位//因为32-bit int型  max:2147483647
double MAX = pow(2,31) - 1;
int temp = abs(x);

if (x < 0)
{
MAX=MAX+1;// min:-2147483648
flag = 1;
}
while (temp / pow(10, k)<1&&k>=0)
{
a[k] = 0;
k--;//能知道x是几位数   10^k   k+1位   0~k
}

for (j = k; j >= 0; j--)
{
a[j+(9-k)] =int(temp / pow(10,j));
temp = temp % int(pow(10,j));
}
if (a[0] < 3)
{
for (i = 0; i<10; i++)
{
if (double(r) <= MAX - a[i] * pow(10, (10 - i - 1)))//未溢出
{
r = r +int( a[i] * pow(10, (10 - i - 1)));
}
else { r = 0; break; }
}
if (flag) r = 0 - r;//负数
}
else  r = 0;
return r;
}};


难点:

整数范围

Int型32位 应为-2^31~+2^31-1

double MAX = pow(2,31) - 1;


负数时,用flag作为负数标志,MAX如果用int型+1会溢出,所以选用double

if (x < 0)
{
MAX=MAX+1;// min:-2147483648
flag = 1;
}


溢出判断

if (double(r) <= MAX - a[i] * pow(10, (10 - i - 1)))//未溢出


数位右移

while (temp / pow(10, k)<1&&k>=0)
{
a[k] = 0;
k--;//能知道x是几位数   10^k   k+1位   0~k
}

for (j = k; j >= 0; j--)
{
a[j+(9-k)] =int(temp / pow(10,j));
temp = temp % int(pow(10,j));
}


尾数为0情况

例如1000和100的相反数都为1

0的情况

之前忘记约束k>=0,当输入int数为0时,造成了死循环

while (temp / pow(10, k)<1&&k>=0)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息