【LeetCode每日一题】2020.6.10 9.回文数

9. 回文数

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

示例:

输入: 121
输出: true

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

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

进阶:

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

分析:

法1:如果将整数转换为字符串来解决这个问题,会非常简单,只需要对转换后的字符串进行一次遍历就可以了。而且只需要遍历一半的元素。

法2:如果根据进阶的要求。我们可以对数字进行一半的翻转。我们求取数字的后一半的翻转。具体做法是,不断地对原数字x进行取余,得到的结果保存在变量reversed中。当在reversed < x时,继续循环,reversed * 10作为高一位,同时继续对x取余,加上余数作为低位。同时对x / 10。

​ 例如:对121进行上述操作,

  1. reversed = 1

    x = 12

  2. reversed = 1 * 10 + 2

    x = 1

接着如何通过翻转后的数字来判断回文呢?对于偶数原数字,判断reversed == x即可。对于奇数数字,reversed最后会比x高一位,只需要reversed / 10 == x即可。因为中间的一位数字只有一个,不会影响回文序列。

注意事项:

​ 有一些数我们是可以直接判断不能构成回文序列的。

  • 负数,由于存在负号。
  • 个位为0,且不为0的数。高位无法存在0。

代码(Golang):

// 法1
func isPalindrome1(x int) bool {
    str := strconv.Itoa(x)
    n := len(str)
    for i := 0; i < n / 2 + 1; i++ {
        if str[i] != str[n - 1 - i] {
            return false
        }
    }
    return true
}

// 法2
func isPalindrome2(x int) bool {
    if x < 0 || x % 10 == 0 && x != 0 {
        return false
    }
    reversed := 0
    for reversed < x {
        reversed = reversed * 10 + x % 10
        x /= 10
    }
    return reversed == x || reversed / 10 == x
}

小结:

​ 字符串解法非常简单,翻转数字的写法很有趣。

posted @ 2020-06-10 09:45  macguz  阅读(160)  评论(0编辑  收藏  举报