——随记
今天去了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)