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
}

相关推荐
民乐团扒谱机11 小时前
【微实验】从迷雾中看清世界:卡尔曼滤波的数学诗意与MATLAB实践
人工智能·算法·matlab·卡尔曼滤波·kalman
什巳11 小时前
JAVA练习275-乘积最大子数组
java·开发语言·数据结构·算法
@踏雪寻梅11 小时前
27. 移除元素
算法
小牛不牛的程序员11 小时前
利用Claude Code构建自动化需求挖掘工具:从原理到实践
java·算法·自动化
Mr.HeBoYan11 小时前
DPDK为什么越来越少使用rte_ring?——从Lock-Free到Run-to-Completion,重新理解现代DPDK架构演进(上)
linux·网络·算法·性能优化·架构·dpdk
在书中成长12 小时前
HarmonyOS 小游戏《对战五子棋》开发第14篇 - 困难AI实现:Minimax算法原理详解
人工智能·算法·harmonyos
格子软件12 小时前
GEO系统深度实战:多引擎自适应算法与去中心化流控
人工智能·算法·去中心化·区块链
北冥you鱼12 小时前
Go语言sync包在区块链开发中的数据同步实践
golang·centos·区块链
宝贝儿好12 小时前
【LLM】第三章:BERT讲解+情感分析案例
人工智能·深度学习·神经网络·算法·自然语言处理·bert
z小猫不吃鱼12 小时前
06 权重幅值剪枝、剪枝后微调与稀疏网络训练:模型剪枝中的三个基本问题
网络·算法·剪枝