文章起笔:2021年10月30日17:34:29
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-231 <= x <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这种思路很直接,就是把 x
先装换为字符串,然后分割为字符数组,将该字符数组进行翻转操作,然后根据情况进行去零添加负号的操作。最后返回拼接之后并转换为数字的结果。
/** * @param {number} x * @return {number} */ var reverse = function(x) { let result = 0; // 将x转为字符串,并分割为单个字符,同时进行翻转操作,存于numArr中 let numArr = x.toString().split('').reverse(); // 可能遇到 x=100 这类的情况,需要将反转之后首位零进行去除 while(numArr[0] === '0') { numArr.shift(); } // 如果x原先是负数,那么需要将负号放到首位 if(x < 0) { numArr.unshift(numArr.pop()); } // 将反转之后的结果进行拼接并转为整数,存在result中 result = parseInt(numArr.join('')); // 如果result超出范围,则直接返回0,否则的话返回result return result <= Math.pow(2,31)-1 && result >= -Math.pow(2,31) ? result : 0; }; 提交记录 执行结果:通过 1032 / 1032 个通过测试用例 执行用时:80 ms, 在所有 JavaScript 提交中击败了83.18%的用户 内存消耗:39.6 MB, 在所有 JavaScript 提交中击败了18.28%的用户 时间:2021/10/30 17:39
乍一看没啥问题,提交之后也能通过,但是题目中说了:假设环境不允许存储 64 位整数(有符号或无符号)。也就是说,如果在【将反转之后的结果进行拼接并转为整数,存在result中】这步中就发现结果溢出,那么就会报错了,而不会进行到之后的判断中。所以这种方法不符合题意。
通用一点的方法就是进行循环取余操作。不断地取 x
与 10
相除的余数,并将该余数不断拼接到反转后的结果的后面。这样就能完成反转操作了,当然,如果中途发现结果已经溢出了,那么就可以事先返回 0
。
/** * @param {number} x * @return {number} */ var reverse = function(x) { let result = 0; // remaining用来保存每次计算所得的余数 let remaining = 0; // 不断对 x 取余,直到 x 降为0 while(x) { remaining = x % 10; // 将x末位去掉 x = (x - remaining) / 10; // result后拼接刚才得到的余数 result = result * 10 + remaining; // 如果发现当前结果已经溢出,则可以事先返回0 if((-Math.pow(2,31) > result) || (result > Math.pow(2,31)-1)) { return 0; } } // 如果反转后的结果在规定范围内,则将其返回 return result; }; 提交记录 执行结果:通过 1032 / 1032 个通过测试用例 执行用时:76 ms, 在所有 JavaScript 提交中击败了92.48%的用户 内存消耗:39.3 MB, 在所有 JavaScript 提交中击败了68.61%的用户 时间:2021/10/30 18:10
更新:2021年7月29日18:43:21
因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。
【更新结束】
更新:2021年10月30日17:45:46
参考:整数反转 - 整数反转 - 力扣(LeetCode)
【更新结束】
暂无