💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
:-: 4.2 反转整数 * * * * * **题干:** 给定一个 32 位有符号整数,将整数中的数字进行反转。 示例 1: ~~~ 输入: 1234 输出: 4321 ~~~ 示例 2: ~~~ 输入: -123 输出: -321 ~~~ 示例 3: ~~~ 输入: 120 输出: 21 ~~~ 注意: 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1],范围也就是(-2147483648~2147483647)。根据这个假设,如果反转后的整数溢出,则返回 0。 **题目分析:** 一看是将数字反转,这肯定把原数字先对10求余,再将求余后所得数字乘以10加上上次数字和,再将原数字除以10,重复以上步骤,直到原数字等于0. **新手有可能遇到的解题思路陷阱:** 所求的反转数字,可能在反转过程中就超出了int类型的数值范围,导致舍弃了超出的部分,剩下的继续进行了循环相加,但是此时数字已经改变,不是我们所期望的值,所以我们每次都要对循环中的反转数字加以判断,一旦超出范围,就返回0。 **解题思路分析以及代码实现:** 第一种思路:偷梁换柱——long类型代替int类型进行判断,最后返回值强转(long -> int) 第一种思路代码: ~~~ public int reverse(int x) { long sum = 0; while (x != 0) { int y = x % 10; sum = y + sum * 10; if (sum < Integer.MIN_VALUE || sum > Integer.MAX_VALUE) { return 0; } x = x / 10; } return (int) sum; } ~~~ **复杂度分析:** 时间复杂度:O(1)。 空间复杂度:O(1)。 第二种思路:提前发现,及时处理——在累加反转数字的步骤前进行提前预判。 第二种思路代码: ~~~ public int reverse(int x) { int sum = 0; while (x != 0) { int y = x % 10; if (sum < Integer.MIN_VALUE / 10 || sum > Integer.MAX_VALUE / 10) { return 0; } sum = y + sum * 10; x = x / 10; } return sum; } ~~~ **复杂度分析:** 时间复杂度:O(1)。 空间复杂度:O(1)。 **若有理解错误的、写错的地方、更好的思路,方法,望各位读者评论或者发邮件指正或指点我,不胜感激。**