前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode - 整数反转

leetcode - 整数反转

作者头像
江涛学编程
发布2021-01-28 15:30:18
3360
发布2021-01-28 15:30:18
举报
文章被收录于专栏:江涛的博客江涛的博客

题意

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

注意:

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

示例

示例 1:

代码语言:javascript
复制
输入:x = 123
输出:321

示例 2:

代码语言:javascript
复制
输入:x = -123
输出:-321

示例 3:

代码语言:javascript
复制
输入:x = 120
输出:21

示例 4:

代码语言:javascript
复制
输入:x = 0
输出:0

提示:

  • -2^31 <= x <= 2^31 - 1

出处

链接:https://leetcode-cn.com/problems/reverse-integer

思路

这题假如是个小学一年级的期末考试题,我们大概会这么做,从右边往左边读然后依次写下来,如果读到最后一个是“-”减号,我们就把它放到写下数字的最前面。言下之意就是,我不要把它看成数字处理,我把它看成字符串,然后一翻转。这里考虑下带不带负号,假设带上吧,那你就要考虑最后那位是不是“-”了,如果不带吧,那你就要判断它原值是正数还是负数了。

这里需要注意的是在 Javascript 语言中,Number 类型的范围是[-2^53 - 1, 2^53 - 1],所以如果你转换成字符串处理,你是感受不到溢出的,需要去人肉判断一波,该值是否在题意给定的[−2^31, 2^31 − 1]区间。除此之外,Javascript 的字符串中并没有字符串反转的 API,但是有数组反转的 API,所以曲线救国,就先转成字符串然后转成数组反转再转回字符串。这个是完全根据 Javascript 语言特性和小学生思维的解法写的。

当然啦,你也可以按照数字去解题,如果原值不为 0,将原值对于 10 取其余数塞到新组成的字符串的后面,新的原值等于原值整除 10, 前提你还是要先判断有没有溢出,然后该值的正负性。然后如果该值不为 0,要去掉开头的 0, 如示例 3 所示.

代码

代码语言:javascript
复制
/**
 * @param {number} x
 * @return {number}
 */
const reverse = function(x) {
    const str = Math.abs(x).toString();
    const str_reverse = str.split('').reverse().join('');
    return x >= 0 ? Number(str_reverse) > Math.pow(2, 31) - 1 ? 0 : Number(str_reverse) : -Number(str_reverse) < Math.pow(-2, 31) ? 0 : -Number(str_reverse);
};

export default reverse;

测试

代码语言:javascript
复制
import twoSum from '../../code/leetcode/7';

describe('test function reverse:', () => {

    test('test case x = 123', () => {
        const res = twoSum(123);
        expect(res).toBe(321);
    });

    test('test case x = -123', () => {
        const res = twoSum(-123);
        expect(res).toBe(-321);
    });

    test('test case x = 120', () => {
        const res = twoSum(120);
        expect(res).toBe(21);
    });

    test('test case x = 0', () => {
        const res = twoSum(0);
        expect(res).toBe(0);
    });

    test('test case x = 1534236469', () => {
        const res = twoSum(1534236469);
        expect(res).toBe(0);
    });
})

思考

  • 就上面提到的用数字取余数的解法,有兴趣的同学可以去试下
  • 题目中给出的区间具体值是多大2^31-1=2147483647,-2^31=-2147483648

参考

JS 的 Number 类型:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number

说明

本文首发于 GitHub 仓库https://github.com/ataola/coding,线上阅读地址:https://zhengjiangtao.cn/coding/,转载请注明出处,谢谢!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 江涛学编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意
  • 示例
    • 示例 1:
      • 示例 2:
        • 示例 3:
          • 示例 4:
          • 提示:
          • 出处
          • 思路
          • 代码
          • 测试
          • 思考
          • 参考
          • 说明
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档