将给出的整数x翻转_整数反转

题目来源力扣第七题,链接:https://leetcode-cn.com/problems/reverse-integer

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123

输出: 321

示例 2:

输入: -123

输出: -321

示例 3:

输入: 120

输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31,  2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

解题思路:

1. 设输入为 “123”

2. 每次取最后一位数据进行计算(结果加上其数值与权值相乘)然后加上其结果,如上例中,

2.1 取 ”123“中的”3“,3 * 100 = 300

2.2 取”123“中的”2“, 2 * 10 =20

2.3 取”123“中的”1“, 1 * 1 = 1

故结果为:300 + 20 + 1 = 321

3. 实时判断数据是否溢出,若溢出返回0

3.1 实时判断结果值是否大于INI_MAX/10 或小于 INI_MIN/10,如达到此条件则需要留意数据是否还有下一位,如有则可判断为溢出。

3.2 实时判断结果值是否等于INI_MAX/10或INI_MIN/10, 如达到此条件则需要考虑数据下一位是否有,若有,是否大于7或者小于-8,若是,则溢出返回0。

代码:

#include #include

using namespacestd;classSolution {public:int reverse(intx) {int result(0);while (x!=0) {if (result > INT_MAX / 10 || (result == INT_MAX && x > 7)) {return 0;

}if (result < INT_MIN / 10 || (result == INT_MIN && x < -8)) {return 0;

}

result*=10; // 每取出一位数,则提升之前所有已取出位数的权值

result+= x % 10; // 取出最后一位数,并加到结果中

x/= 10; // 舍去已添加位数

}returnresult;

}

};intmain() {

Solution solution;int eg0(2147483647), eg1(1463847412), eg2(-123456);

cout<< "eg0:" << solution.reverse(eg0) <

cout<< "eg1:" << solution.reverse(eg1) <

cout<< "eg2:" << solution.reverse(eg2) <

}

输出:

eg0: 0

eg1: 2147483641

eg2: -654321

学习了一下他人的代码发现,自己身体不清,考虑不周。由于题目中假设环境中只能存储32位数据,故无论输入数据还是输出数据均只能为32位数据,故无需做 上述中3.2的判断。若结果前九位的值未超过INI_MAX以及未小于INI_MIN的值,则无需判断第十位是否溢出,因为,其值只能在 -2 ~

2 之间

代码修改:

#include #include

using namespacestd;classSolution {public:int reverse(intx) {int result(0);while (x!=0) {if (result > INT_MAX / 10) {return 0;

}if (result < INT_MIN / 10) {return 0;

}

result*=10;

result+= x % 10;

x/= 10;

}returnresult;

}

};intmain() {

Solution solution;int eg0(2147483647), eg1(1463847412), eg2(-123456);

cout<< "eg0:" << solution.reverse(eg0) <

cout<< "eg1:" << solution.reverse(eg1) <

cout<< "eg2:" << solution.reverse(eg2) <

}

输出:

eg0: 0

eg1: 2147483641

eg2: -654321

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值