【LeetCode】9,回文数。 难度等级:简单。巧妙解法很多,值得推敲。

news/2024/11/17 3:36:13/

文章目录

    • 一、题目
    • 二、我的解答:逐个判断对应位置的首末数字是否相同
    • 三、其他解答
      • 3.1 将数字x转为字符串进行处理
      • 3.2 反转一半数字进行比较

LeetCode 第9题,回文数;难度等级:简单

一、题目

在这里插入图片描述

二、我的解答:逐个判断对应位置的首末数字是否相同

我的第一想法是直接处理数字,逐个判断对应位置的首末数字是否相同。导致代码写的比较复杂,速度也不快。代码如下:

class Solution {
public:bool isPalindrome(int x) {if(x<0)return false;else if(x>=0 && x<10)return true;else{// 先计算 x 的长度 lengthint length=1;while(x/int(pow(10,length))>=10){length++;}length++;//逐个判断对应位置的首末数字是否相同,如 12345 中的 1-5和2-4for(int i=1;i!=length/2+1;i++){int end=(x % int(pow(10,i)))/int(pow(10,i-1));int begin=(x/int(pow(10,length-i)))%10;if(begin!=end)return false;}return true;}}
};

执行结果:

执行用时:20 ms, 在所有 C++ 提交中击败了 17.33% 的用户
内存消耗:6 MB, 在所有 C++ 提交中击败了 11.80% 的用户

三、其他解答

3.1 将数字x转为字符串进行处理

逐个位数比较数字非常麻烦,但处理字符串是很简单的,因为只需要下标操作即可。因此可以将数字x转为字符串进行处理,代码如下(我自己写的,官方代码只有C++):

class Solution {
public:bool isPalindrome(int x) {if(x < 0 || (x % 10 == 0 && x != 0))return false;// 将x转为字符串string str_x=to_string(x);int length=str_x.size();for(int i=0;i!=length/2;i++)if(str_x[i]!=str_x[length-i-1])return false;return true;}
};

执行结果:

执行用时: 4 ms, 在所有 C++ 提交中击败了 95.08% 的用户
内存消耗: 5.8 MB, 在所有 C++ 提交中击败了 33.42% 的用户

知识点:

(1) string s = to_string(i)用于将数字常量转换为字符串,但需要包含头文件 #include<string>
(2) str.size()和str.length()都可以获取字符串长度

3.2 反转一半数字进行比较

如何判断 x = 1234是不是回文数呢?除了依次判断数对 (1,4) 和 (2,3) 是否相等,还有一种直观的方法是先获得 x 的逆序数 x_reverse = 4321,然后通过 if(x == x_reverse) 来判断 x 是否为回文数。但这样容易造成数值上溢,如:

最大整数为 intMax = 2^31^-1 = 2147483647,而 intMax _reverse = 7463847412 > intMax 

intMax 反转后就导致了数值上溢,尽管可以使用 long long等数据类型来解决该问题,但这种解决方法显然是不完美的。

实际上,只需要反转一半数字就可以判断回文数。

比如获得 x = 1234 的一半反转数字 x_reverse = 43,然后获得前一半的数字 x_begin = 12,通过if(x_begin == x_reverse) 来判断 x 是否为回文数。但需要特别注意奇数和偶数的情况下,获得的x_begin 是不同的。

代码:

class Solution {
public:bool isPalindrome(int x) {if(x < 0 || (x % 10 == 0 && x != 0))return false;int x_reverse=0;while(x_reverse < x){x_reverse = x_reverse*10+x%10;x/=10;}// 当数字长度为奇数时,我们可以通过 x_reverse/10 去除处于中位的数字。// 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,x_reverse = 123,// 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。return x==x_reverse || x==x_reverse/10;}
};

知识点:

return x==x_reverse || x==x_reverse/10;  这一步非常巧妙

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

相关文章

【网络进阶】WebSocket协议

文章目录 1. Web实时技术的应用2. WebSocket协议介绍2.1 WebSocket的工作原理2.2 优点2.3. 使用场景2.4 实现细节 3. WebSocket服务器实现3.1 客户端代码&#xff08;HTML & JavaScript&#xff09;3.2 服务器端代码&#xff08;C&#xff09;3.3 测试结果 1. Web实时技术的…

CypherRat使用

cypherrat3.5 安卓远控&#xff0c;很早之前在tg下的&#xff0c;现在可能有高版本的 使用感受 图形化界面&#xff08;相比于msf&#xff09;可用于演练新场景&#xff0c;实战的话只能用xx破解版或是瑟瑟apk让人忽视风险继续安装由于国内安卓&#xff0c;部分功能失效 生成…

五种最危险的新兴网络攻击技术

SANS研究所的网络专家揭示了包括网络罪犯和民族国家行为者在内的网络攻击者正在使用的五种最危险的新兴网络攻击技术。在旧金山举行的RSA网络安全会议上&#xff0c;由SANS研究所的几位分析师组成的讨论组讨论了新兴的网络攻击战术、技术和程序&#xff0c;并提供了如何为企业做…

Python 面向对象

Python 是一种面向对象编程语言&#xff0c;支持类、对象、继承、多态等面向对象特性。下面是一些 Python 面向对象编程的基本概念和操作&#xff1a; 1. 定义类和对象 在 Python 中&#xff0c;可以使用 class 关键字定义类。类包含属性和方法&#xff0c;属性是类的数据成员…

界面控件DevExpress WPF富文本编辑器,让系统拥有Word功能(二)

DevExpress WPF控件的富文本编辑器允许开发者将文字处理功能集成到下一个WPF项目中&#xff0c;凭借其全面的文本格式选项、邮件合并以及丰富的终端用户选项集合&#xff0c;可以轻松地提供Microsoft Word功能。 DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足…

AMBA协议-AXI协议详解(读写时序、Outstanding、乱序传输、原子操作)

目录 1. AXI 写通道信号 1.1. 写地址通道信号 1.2. 写数据通道信号 1.3. 写response通道信号 1.5. 握手规则 1.4. AXI 写通道之间关系 2. AXI 读通道信号 2.1. 读地址通道信号 2.2. 读数据通道信号 2.3. AXI 读通道之间关系 3. AXI传输 3.1. AXI突发读传输 3.2. …

2022 gdcpc题解(10/13)

2022gdcpc 和学弟vp了一下这场&#xff0c;本来抓的数学选手咕咕了&#xff0c;只有2个人&#xff0c;打下来的感觉就是套路题和码量太大了&#xff0c;太久没写码量题导致 I I I调太久了&#xff0c;最后G没写完&#xff0c;K也没冲出来&#xff0c;感觉数学大爹在的话这K应该…

Java注解源码分析,实现自定义注解通过反射获取

Annotation 源码分析 JDK5.0 引入,可以通过反射机制动态获取&#xff0c;大量应用于java框架中 内置注解 Override 重写父类方法时 Target(ElementType.METHOD) //该注解只能作用于方法 Retention(RetentionPolicy.SOURCE) //在编译时起作用&#xff0c;静态检查 public int…