本篇是【leetcode easy】专题的第二篇,题目要求是将一个int类型的有符号数,进行逆序输出(输出也是int类型)。
可能忽略的地方有以下两点:
- 当输入的整数是负数或者是末尾有0的话,若采用将整数先转化为string类型,在进行输出的话,还需要单独处理负号和0的问题。
- 输入的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);
}
};
其中值得学习的有以下几点:
持续更新中,敬请关注……
- 关键代码为while循环中的三行,其惊人地实现了整数的逆置。其技巧是逆序buffer res先乘,输入的x 最后除(以),从末尾开始依次进行,用一个循环搞定原始输入位数递减,buffer res逆序位数增长。值得借鉴!
- c++中可以直接利用模板库中的numeric_limits函数进行查看常用数据结构的范围,其具体介绍如下:https://en.cppreference.com/w/cpp/types/numeric_limits