回文数

题目

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/palindrome-number

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

示例 1:

输入: 121
输出: true
1
2

示例 2:

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

示例 3:

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

进阶:

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

翻转数方案

方案思路

该方案来自精选题解。

核心思路是:取出后半段与前半段进行比较是否相等。

判断是否达到一半的思路是,判断后半段的值与前半段的值的大小关系。若后半段大,一定到达了一半。

Go 编码实现

在 LeetCode 上:

执行结果:通过

执行用时 :12 ms, 在所有 golang 提交中击败了93.16%的用户

内存消耗 :5 MB, 在所有 golang 提交中击败了98.63%的用户

func isPalindrome(x int) bool {
	// 负数不可能
	if x < 0 {
		return false
	}
	// 10 的整数倍不可能,因为不能有首位为 0 的数
	if x % 10 == 0 && x != 0 {
		return false
	}

	// 翻转数
	reverseX := 0
	// x 原始数 大于 翻转数
	// 原始数每次 除以 10, 翻转数每次 乘10 累加余数
	for x > reverseX {
		reverseX = reverseX * 10 + x%10
		x /= 10
	}
	// 考虑奇偶数的情况
	return x == reverseX || x== reverseX/10
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21