回文数[简单]

news/2024/11/8 3:01:50/

优质博文:IT-BLOG-CN

一、题目

给你一个整数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

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

二、代码

思路: 第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。第二个想法是将数字本身反转,然后将反转后的数字与原始数字进行比较,如果它们是相同的,那么这个数字就是回文。 但是,如果反转后的数字大于int.MAX,我们将遇到整数溢出问题。

按照第二个想法,为了避免数字反转可能导致的溢出问题,为什么不考虑只反转int数字的一半?毕竟,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。例如,输入1221,我们可以将数字1221的后半部分从21反转为12,并将其与前半部分12进行比较,因为二者相同,我们得知数字1221是回文。

首先,我们应该处理一些临界情况。所有负数都不可能是回文,例如:-123不是回文,因为-不等于3。所以我们可以对所有负数返回false。除了0以外,所有个位是0的数字不可能是回文,因为最高位不等于0。所以我们可以对所有大于0且个位是0的数字返回false

现在,让我们来考虑如何反转后半部分的数字。对于数字1221,如果执行1221 % 10,我们将得到最后一位数字1,要得到倒数第二位数字,我们可以先通过除以10把最后一位数字从1221中移除,1221 / 10 = 122,再求出上一步结果除以10的余数,122 % 10 = 2,就可以得到倒数第二位数字。如果我们把最后一位数字乘以10,再加上倒数第二位数字,1 * 10 + 2 = 12,就得到了我们想要的反转后的数字。如果继续这个过程,我们将得到更多位数的反转数字。

现在的问题是,我们如何知道反转数字的位数已经达到原始数字位数的一半?由于整个过程我们不断将原始数字除以10,然后给反转后的数字乘上10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了

class Solution {public boolean isPalindrome(int x) {// 思路:因为不能使用字符串和反转整个整数,因为反转后数int溢出,所以只能创建一个变量保存一般的数据,利于/和%// 第一步:先排除特殊的场景,但是0是符合的if (x < 0 ||  (x > 0 && x % 10 == 0)) {return false;}// 第二步:创建一个变量保存 % 后的数据,并对当前x进行/操作int temp = 0;while (x > temp) {// 退出条件:x不断减小, temp不断变大,最终就会退出,先让原有的数进一为给尾数留个坑位temp = temp * 10 + x % 10;x = x / 10;}// 第三步,判断x与temp是否相同,特殊场景判断:当x为奇数时 temp 会比 x多以为,比如 12321 进行上面的拆分后 x = 12 temp = 123,所以需要对 temp进行 /return temp == x || temp /10  == x;}
}

时间复杂度: O(log⁡n)对于每次迭代,我们会将输入除以10,因此时间复杂度为O(log⁡n)
空间复杂度: O(1)我们只需要常数空间存放若干变量。


http://www.ppmy.cn/news/1195605.html

相关文章

时间序列聚类的直观方法

一、介绍 我们将使用轮廓分数和一些距离度量来执行时间序列聚类实验&#xff0c;同时利用直观的可视化&#xff0c;让我们看看下面的时间序列&#xff1a; 这些可以被视为具有正弦、余弦、方波和锯齿波的四种不同的周期性时间序列 如果我们添加随机噪声和距原点的距离来沿 y 轴…

C语言:函数的定义与使用

C语言函数的定义和使用&#xff1a; 1、函数定义格式 数据类型 函数名&#xff08;数据类型 形参&#xff0c;....&#xff09; {函数体;return 数据; }函数名&#xff08;实参,.......&#xff09;在不同的中&#xff0c;变量名可以相同&#xff0c;因为作用域不同 执行流…

【C++】类和对象(中)之拷贝构造与运算符、操作符重载

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 前言 我们继续学习默认成员函数&#xff0c;本篇文…

二叉树进阶 - (C++二叉搜索树的实现)

二叉树进阶 - &#xff08;二叉搜索树的实现&#xff09; 二叉搜索树1. 二叉搜索树概念2. 二叉搜索树操作2.1 二叉搜索树的查找2.2 二叉搜索树的插入2.3 二叉搜索树的删除(重点) 3. 二叉搜索树的(代码)实现 二叉搜索树 1. 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0…

设计模式之工厂模式讲解与案例

工厂模式是一种创建对象的设计模式&#xff0c;它通过提供一个统一的接口来创建对象&#xff0c;隐藏了具体对象的实例化过程。Java中的工厂模式有多种实现方式&#xff0c;下面我将举两个常见的例子。 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;&#xff1a…

Git 删除本地和远程分支

目录 删除本地和远程分支分支删除验证验证本地分支验证远程分支 开源项目微服务商城项目前后端分离项目 删除本地和远程分支 删除 youlai-mall 的 dev 本地和远程分支 # 删除本地 dev 分支&#xff08;注&#xff1a;一定要切换到dev之外的分支才能删除&#xff0c;否则报错&…

【华为OD题库-003】最佳植树距离-Java

题目 小明在直线的公路上种树&#xff0c;现在给定可以种树的坑位的数星和位置&#xff0c;以及需要种多少棵树苗&#xff0c;问树苗之间的最小间距是多少时&#xff0c;可以保证种的最均匀&#xff08;两棵树苗之间的最小间距最大) 输入描述 输入三行: 第一行一个整数:坑位的数…

12 pinctrl 和 gpio 子系统

一、pinctrl 子系统 1. 什么是 pinctrl 子系统&#xff1f; 首先回顾一下如何初始化 LED 所使用的 GPIO&#xff1a; ①、修改设备树&#xff0c;添加相应的节点&#xff0c;节点里面重点是设置 reg 属性&#xff0c; reg 属性包括了 GPIO相关寄存器。 ②、获取 reg 属性中 …