前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小白刷力扣之整数反转与回文数

小白刷力扣之整数反转与回文数

作者头像
周萝卜
发布2020-05-22 10:49:28
3250
发布2020-05-22 10:49:28
举报
文章被收录于专栏:萝卜大杂烩萝卜大杂烩

今天我们继续力扣之旅,还是从简单的题目下手,整数反转与回文数

整数反转

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

示例 1:

输入: 123 输出: 321 示例 2:

输入: -123 输出: -321 示例 3:

输入: 120 输出: 21 注意:

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

其实这个题目已经足够简单了,在解题的时候,只需要注意下溢出问题即可。

Way 1

非常容易想到的一种方法就是把给定的整数转换为字符串,然后通过字符串的反转来得到整数的反转,看代码

代码语言:javascript
复制
class Solution:
    def reverse(self, x: int) -> int:
        if x < 0:
            myint = - int(str(-x)[::-1])
            if myint < -2147483648:
                return 0
            return - int(str(-x)[::-1])
        else:
            myint = int(str(x)[::-1])
            if myint > 2147483647:
                return 0
            return int(str(x)[::-1])

这种解法是比较容易想到的,当然最终的成绩虽然是通过,但是却还有比较大的提升空间。

下面我们再来通过数学的方法来优化下

Way 2

对于一个整数,我们可以通过取它与10的模来获得最后一位数字,然后再把该数字乘以10,同时重置该整数为他自己的整除数值,以此类推,直至这个整数整除为0为止。

当然还需要注意整数的符号和溢出问题

代码语言:javascript
复制
class Solution:
    def reverse(self, x: int) -> int:
        reverse = 0
        if x >= 0:
            while x != 0:
                tail = x % 10
                x //= 10
                reverse = reverse * 10 + tail
            if reverse > 2**31 -1:
                return 0
            else:
                return reverse
        else:
            x = abs(x)
            while x != 0:
                tail = x % 10
                x //= 10
                reverse = reverse * 10 + tail
            if - reverse < - 2**31:
                return 0
            else:
                return - reverse

Java 实现

代码语言:javascript
复制
class Solution {
    public int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
            if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }
}

回文数

题目描述: 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)都是一样的整数。

示例 1:

输入: 121 输出: true 示例 2:

输入: -121 输出: false 解释: 从左向右读, 为 -121 。从右向左读, 为 121- 。因此它不是一个回文数。 示例 3:

输入: 10 输出: false 解释: 从右向左读, 为 01 。因此它不是一个回文数。

进阶:

你能不将整数转为字符串来解决这个问题吗?

题目里也说了,最好不用字符串的方式来解决,那么我们来看看思路吧。

Way 1

我们可以继续使用上面整数反转的方式来解决

代码语言:javascript
复制
class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0:
            return False
        elif x == 0:
            return True
        elif x % 10 == 0:
            return False
        else:
            y = x
            reverse = 0
            while (x != 0):
                tail = x % 10
                x //= 10
                reverse = reverse * 10 + tail
            if y == reverse:
                return True
            else:
                return False

不过这种解法效果并不是很好

下面我们可以再进一步,来看看回文数的特点。

Way 2

回文数,必定会是一个前后对称的数字,比如:123321,3223 等等,所以如果我们能够拿出前半部分与后半部分,对比这两部分是否一致也是可以的

代码语言:javascript
复制
class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0:
            return False
        length = 0
        help = 1
        tmp = x
        while tmp != 0:
            length += 1
            tmp //= 10
        for i in range(1, length):
            help *= 10
        while (x != 0):
            head = x // help
            tail = x % 10
            if head != tail:
                return False
            x = x % help // 10
            help //= 100
        return True

该方法看似只循环了一般的数据,但是实际上结果却并没有提升太多

看来这种回文数问题,在没有限制的前提下,还是使用字符串的方法来解决最好。

代码语言:javascript
复制
class Solution:
    def isPalindrome(self, x: int) -> bool:
        mystr = str(x)
        return mystr == mystr[::-1]

简洁又方便

Java 实现

代码语言:javascript
复制
class Solution {
     public boolean isPalindrome(int x) {
        if (x < 0) {
            return false;
        }
        int help = 1;
        int tmp = x;
        while (tmp >= 10) {
            help *= 10;
            tmp /= 10;
        }
        while (x != 0) {
            if (x % 10 != x / help) {
                return false;
            }
            x = x % help / 10;
            help /= 100;
        }
        return true;
    }
}

今天的两道算法题都属于比较简单的,哈哈哈,从简单的开始,给自己增加信心呀!!

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

本文分享自 萝卜大杂烩 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 整数反转
  • Way 1
  • Way 2
    • 回文数
    • Way 1
    • Way 2
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档