LeetCode之Reverse Integer

——随记

今天去了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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值