20241106,LeetCode 每日一题,用 Go 实现整数回文数判断

题目

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

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

示例 1:

输入:x = 121

输出:true

示例 2:

输入:x = -121

输出:false

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

示例 3:

输入:x = 10

输出:false

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

提示:

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

问题分析

  • 121 是回文,因为从前往后和从后往前都一样。
  • -121 不是回文,因为负号不能出现在末尾。
  • 10 也不是回文,因为从前往后是 "10",但从后往前是 "01"。

思路

通过反转一半的数字来判断是否回文。

1、排除特殊情况: 一开始排除一些特殊数字,比如负数肯定不是回文,另外如果一个不是0的整数的个位是0,它也不是回文(因为开头肯定不是0)。

2、逐步反转: 从原始整数的最后一位(x%10​)开始提取,放到新的整数reversedHalf​的末尾(reversedHalf*10 + x%10​),然后把这个数字从原整数中剔除(x /= 10​)

3、停止条件: 当原始整数剩余部分小于新的整数,说明已经反转了一半数字了

4、判断回文: 如果是偶数个数,则两个数相等;如果是奇数个数,则 x 就等于 reversedHalf/10​,忽略中间的数字。

复杂度

  • 时间复杂度: O(log n)
  • 空间复杂度: O(1)

代码实现

go 复制代码
func isPalindrome(x int) bool {
	if x < 0 || (x%10 == 0 && x != 0) {
		return false
	}
	reversedHalf := 0
	for x > reversedHalf {
		reversedHalf = reversedHalf*10 + x%10
		x /= 10
	}
	return x == reversedHalf || x == reversedHalf/10
}

相关推荐
梁辰兴32 分钟前
数据结构:排序
数据结构·算法·排序算法·c·插入排序·排序·交换排序
Lris-KK1 小时前
【Leetcode】高频SQL基础题--1731.每位经理的下属员工数量
sql·leetcode
野犬寒鸦1 小时前
力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)
java·数据结构·算法·leetcode·面试
菜鸟得菜1 小时前
leecode kadane算法 解决数组中子数组的最大和,以及环形数组连续子数组的最大和问题
数据结构·算法·leetcode
楼田莉子2 小时前
C++算法专题学习——分治
数据结构·c++·学习·算法·leetcode·排序算法
He1955012 小时前
Go初级之十:错误处理与程序健壮性
开发语言·python·golang
一支鱼2 小时前
leetcode常用解题方案总结
前端·算法·leetcode
ulias2122 小时前
各种背包问题简述
数据结构·c++·算法·动态规划
m0_570466412 小时前
代码随想录算法训练营第二十八天 | 买卖股票的最佳实际、跳跃游戏、K次取反后最大化的数组和
java·开发语言·算法
吃着火锅x唱着歌3 小时前
LeetCode 1537.最大得分
算法·leetcode·职场和发展