给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数
是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,
121
是回文,而123
不是。
示例 1:
输入:x = 121 输出:true
示例 2:
输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10 输出:false 解释:从右向左读, 为 01 。因此它不是一个回文数。
提示:
-231 <= x <= 231 - 1
步骤1:问题性质分析
问题定义: 题目要求我们判断一个给定的整数 x
是否是回文数。一个整数是回文数,如果它从左向右读和从右向左读相同。比如,121
是回文数,而 123
不是。
输入输出条件:
- 输入:一个整数
x
,范围是-2^31 <= x <= 2^31 - 1
。 - 输出:如果
x
是回文数,返回true
,否则返回false
。
边界条件:
- 如果
x
为负数,必定不是回文数,因为负号-
不会出现在数字的尾部。 - 如果
x
以0
结尾且不为0
(如10
),则不可能是回文数。 - 单个数字(如
0
或任何个位数)始终是回文数。
步骤2:解题思路分析
方法1:将整数转换为字符串
思路:
- 将整数转换为字符串,之后使用双指针从字符串的两端向中间比较。如果左指针和右指针的字符都相等,则是回文数。
- 若左右指针发现任何字符不相等,则返回
false
。
时间复杂度:O(n),其中 n 为数字转换成字符串后的长度。 空间复杂度:O(n),需要额外的空间存储字符串。
方法2:反转整数的另一半
思路:
- 如果不想使用额外的空间(字符串),可以通过数学运算反转整数的一半,再与另一半比较。
- 具体操作是,将给定的整数逐位反转其右半部分,直到反转后的数大于或等于剩下的数。然后比较反转后的数与剩下的数是否相等。
- 需要特别注意负数和以
0
结尾的情况,这两种情况不能是回文数。
详细步骤:
- 首先处理特殊情况:负数以及以
0
结尾但不为0
的数字直接返回false
。 - 每次通过取余
x % 10
得到当前数字的最末一位,并通过reversed = reversed * 10 + x % 10
更新反转数字,同时通过x /= 10
去掉末尾数字。 - 当反转数字大于等于剩余的数字时,停止。此时如果反转数字与剩余的数字相等或反转数字去掉个位后与剩余的数字相等(考虑数字长度为奇数的情况),则数字为回文。
时间复杂度:O(log n),其中 n 为输入整数的大小。反转数字最多处理一半的位数。 空间复杂度:O(1),不使用额外空间。
步骤3:C++代码实现
步骤4:启发与优化讨论
-
优化方向:
- 如果使用字符串法,虽然代码简单,但它需要额外的空间来存储字符串,空间复杂度为 O(n)。
- 反转一半数字的数学方法避免了使用额外的存储空间,空间复杂度为 O(1)。在实际应用中,对于大规模数据或嵌入式设备等环境,减少空间开销是重要的优化方向。
-
算法优化启发:
- 该题中的一半反转技术是一个很好的思路,表明我们不总是需要完全处理整个数据集。很多时候,只处理一部分数据就可以得出最终结果,这种思想也适用于大规模数据处理中的增量计算和流处理。
- 类似的问题可以推广到一些需要处理对称性或部分数据的场景,极大提升算法效率。
步骤5:实际生活中的应用
这个算法思想不仅限于简单的回文数判断,还可以应用于其他领域中对称性和局部处理的场景。以下是一个实际应用的示例:
实际应用场景:金融系统中的交易对称性检测
在金融系统中,回文数的概念可以推广为对称性检测,例如交易数据或账户操作中的对称性。某些金融欺诈行为可能表现为账户之间资金进出对称的模式。这种模式可以通过反转部分交易记录或账户操作序列,检测出对称的资金流动。
实现方式:
- 收集一定时间段内的交易记录。
- 将交易金额、时间戳等信息转化为交易序列。
- 使用上述反转方法,反转半部分交易序列,检测是否与另一半匹配。如果存在对称性,则标记这些交易,进一步分析是否涉及欺诈。
通过这种方式,金融机构可以快速检测并定位可疑交易,提高资金安全。
这个算法还可以应用于其他对称模式检测,例如DNA序列分析、物流系统中的对称路径优化等。