【LeetCode easy专题】LeetCode7 Reverse Integer

       本篇是【leetcode easy】专题的第二篇,题目要求是将一个int类型的有符号数,进行逆序输出(输出也是int类型)。

       可能忽略的地方有以下两点:

  1. 当输入的整数是负数或者是末尾有0的话,若采用将整数先转化为string类型,在进行输出的话,还需要单独处理负号和0的问题。
  2. 输入的int类型是32bit的,其范围为[−2^31,  2^31 − 1],其逆序输出也要为int类型,如果输入很大,且其末位数字很大的话,转化完以后会存在int越界的情况。常采用的办法是将输出定义为doule或者long long类型,在转化完以后再对其是否大于int的界限进行判断。

      编程的关键是reverse。

     新手(like me)c++的编程如下:

class Solution {
public:
    int reverse(int i) {
    const int place = places(i);
       if (place == 1) {
        return i;
    }   
    else {
        vector<int> num; //记录各位上的数字
        while(i/10){
            num.push_back(i%10); //个位数
            i /= 10;
        }
        num.push_back(i); //最高位数
        double i_reverse = 0;
        for (int j = 0, k = place - 1; j < num.size(); j++,k--) {
            i_reverse += num[j]*pow(10,k);
        }
        if(i_reverse >= -2147483648 && i_reverse < 2147483648)
        return (int)i_reverse;
        else return 0;
    }
}
private:
    const int places(int i){
    int place = 1;
    while(i/10){
        place++;
        i /= 10;
    }
    return place;
 }   
};

这是最直接的思路,超过98%左右的c++用户,网上最快的c++解决代码如下所示:

int x = []{ std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); return 0; }();

class Solution {
public:
    int reverse(int x) {
        long long res = 0;
        
        while (x) {
            res *= 10;
            res += x % 10;
            x /= 10;
        }
        
        if (res > std::numeric_limits<int>::max()) return 0;
        if (res < std::numeric_limits<int>::min()) return 0;
        return static_cast<int>(res);
    }
};

其中值得学习的有以下几点:

            

持续更新中,敬请关注……

  1. 关键代码为while循环中的三行,其惊人地实现了整数的逆置。其技巧是逆序buffer res先乘,输入的x 最后除(以),从末尾开始依次进行,用一个循环搞定原始输入位数递减,buffer res逆序位数增长。值得借鉴!
  2. c++中可以直接利用模板库中的numeric_limits函数进行查看常用数据结构的范围,其具体介绍如下:https://en.cppreference.com/w/cpp/types/numeric_limits                                                                                                           
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值