【JAVA编程】整数反转

题目说明

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [− 2 31 2^{31} 231, 2 31 2^{31} 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0

提示:
- 2 31 2^{31} 231 <= x <= 2 31 2^{31} 231 - 1

问题分析

该问题在于对十进制整数按位取值,十进制证书可以用%10的方式取最低位的值,然后把输入的整数循环/10,这样即可得到整数每一位的值,如下代码所示(假设x大于0):

List<Integer> data = new ArrayList<>();
while (x > 0) {data.add(x % 10);x /= 10;
}

那反转之后的值,就是从data链表中用每一位* 1 0 n 10^n 10n(Math.pow)相加即可:

long out = 0;
int bits = data.size();
for (int i = 0; i < bits; i++) {out += data.get(i) * Math.pow(10, bits - 1 - i);
}

如果不使用原生API,也可以新增一个链表,记录每个整数位对应的次方数,代码如下(假设x大于0):

List<Long> data = new ArrayList<>();
List<Long> base = new ArrayList<>();long mul = 1;
while (x > 0) {long num = x % 10;data.add(num);base.add(mul);mul *= 10;x /= 10;
}long out = 0;
int bits = data.size();
for (int i = 0; i < bits; i++) {out += data.get(i) * base.get(bits - 1 - i);
}

代码实现

实现了整数反转后,后续需要考虑的就是边界问题了,题目限制了超出整数范围的则返回0。正整数的范围为0~0x7FFFFFFF,相对应的负整数的范围为0xFFFFFFFF~0x80000000。
这里有一点需要注意的是,因为JAVA默认数据为Integer类型,0x80000000会被默认转为负数,所以正整数边界比较判断时,应用0x7FFFFFFF,负整数边界判断时,用0x800000000。代码实现如下:

class Solution {public int reverse(int x) {long raw;long rex = 0;List<Long> data = new ArrayList<>();List<Long> base = new ArrayList<>();boolean fushu = false;raw = x;if (x < 0) {fushu = true;raw = -x;}// 对正整数raw进行取反后得到rexlong mul = 1;while (raw > 0) {long num = (raw % 10);data.add(num);base.add(mul);mul *= 10;raw /= 10;}int bits = data.size();for (int i = 0; i < bits; i++) {rex += data.get(i) * base.get(bits - 1 - i);}// 返回反转后的值rexif (fushu) {rex = -rex;if (rex < 0x80000000) {return 0;}return (int)rex;}if (rex > 0x7FFFFFFF) {return 0;}return (int)rex;}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部