【腾讯精选练习50题】9. 回文数(简单)

193 阅读1分钟

题目描述

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

示例 1:

输入:x = 121

输出:true

示例 2:

输入:x = -121

输出:false

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

示例 3:

输入:x = 10

输出:false

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

示例 4:

输入:x = -101

输出:false

思路分析

  • 首先明确,负数肯定都不是,那么接下来考虑非负数
  • 最先想到的就是像7. 整数反转那样,反转过来再比较值
  • 再想一下,既然是回文数,那么其实可以不用整个反转,只要反转一半,就可以比较出是否回文。这样理论上可以快一半。

AC代码

借助整数反转

func isPalindrome(x int) bool {
    if x < 0 {
        return false
    }
    return x == reverse(x)
}

func reverse(x int) int {
    rst := 0
    for x != 0 {
        if rst < math.MinInt32/10 || rst > math.MaxInt32/10 {
            return 0
        }

        val := x % 10
        x = x / 10
        rst = rst*10 + val
    }
    return rst
}

反转一半

func isPalindrome(x int) bool {
    if x < 0 {
        return false
    }

    xstr := strconv.Itoa(x)
    for h, t := 0, len(xstr)-1; h < t; h, t = h+1, t-1 {
        if xstr[h] != xstr[t] {
            return false
        }
    }
    return true
}

总结

  • 不知道leetcode的golang的提交是不是数据不多,反转一半的方法AC之后时间可以超过100%的提交