C/C++教程

【算法-LeetCode】7. 整数反转(字符串;数组;取余)

本文主要是介绍【算法-LeetCode】7. 整数反转(字符串;数组;取余),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

7. 整数反转 - 力扣(LeetCode)

文章起笔: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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的题解

我的题解1(字符串;数组;虽能通过,但不合题意)

这种思路很直接,就是把 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中】这步中就发现结果溢出,那么就会报错了,而不会进行到之后的判断中。所以这种方法不符合题意。

我的题解2(取余)

通用一点的方法就是进行循环取余操作。不断地取 x10 相除的余数,并将该余数不断拼接到反转后的结果的后面。这样就能完成反转操作了,当然,如果中途发现结果已经溢出了,那么就可以事先返回 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)

【更新结束】

有关参考

暂无

这篇关于【算法-LeetCode】7. 整数反转(字符串;数组;取余)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!