C#算法之回文数
作者:痴者工良 发布时间:2022-06-26 20:02:38
标签:C#,算法,回文数
回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
代码模板
public class Solution {
public bool IsPalindrome(int x) {
}
}
笔者的代码
运行时间在120ms左右,笔者的思路是:如果一个数字的反序还是等于这个数,那么这个数就是回文数。
以下代码无法解决反序后可能溢出,可以利用上一题的代码进行溢出检查。
当然,一个int类型的数,如果是回文,那么他的反序肯定不会溢出,反之其反序发生溢出则肯定不是回文数。
public class Solution
{
public bool IsPalindrome(int x)
{
if (x < 0) return false;
int xx = x;
int num = 0; //x的反序
while (xx != 0)//求反序
{
int i = xx % 10;
xx = xx / 10;
num = num * 10 + i;
}
if (x == num) //如果x的反序num==x,那么这个数字是回文数
return true;
else
return false;
}
}
加try-catch,耗时增加 10~20ms
try {
while (xx != 0)
{
int i = xx % 10;
xx = xx / 10;
num = num * 10 + i;
}
}
catch
{
return false;
}
官方这道题给出了示例代码,耗时120ms左右,思路是只反序一半,反序后的原始数、反序一半的数进行比较,也就不用检查溢出。
public class Solution {
public bool IsPalindrome(int x) {
// 特殊情况:
// 如上所述,当 x < 0 时,x 不是回文数。
// 同样地,如果数字的最后一位是 0,为了使该数字为回文,
// 则其第一位数字也应该是 0
// 只有 0 满足这一属性
if(x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int revertedNumber = 0;
while(x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
// 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
// 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
// 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
return x == revertedNumber || x == revertedNumber/10;
}
}
别人用字符串方式进行判断(虽然题目说不能用string),耗时150-180ms,不太稳定
public class Solution
{
public bool IsPalindrome(int x)
{
string str = x.ToString();
for (int i = 0; i < str.Length / 2; ++i)
{
if (str[i] != str[str.Length - 1 - i])
{
return false;
}
}
return true;
}
}
来源:https://www.cnblogs.com/whuanle/p/10352752.html


猜你喜欢
- 面试官:请问StringBuffer和StringBuilder有什么区别?这是一个老生常谈的话题,笔者前几年每次面试都会被问到,作为基础面
- Eclipse项目中为什么会有红感叹号,具体分析一下【问题原因】:工程中classpath中指向的包路径错误【解决办法】:右键项目名称 Bu
- indexof方法:注解:indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置。如果没有找到子字符串,则返回-1
- 设置session有效时间的三种方式session的默认有效时间是30分钟(min)方法一使用java函数:session.setMaxIn
- 1、for循环虽然所有循环结构都可以用 while 或者 do…while来表示,但 for 循环的出现,可使一些循环
- 一个框架的使用,必然离不开其中的组件支持。我们在下载完mybatis框架后,因为大部分的内部结构还没有启动,就要手动的对其进行配置。在之前有
- 1.user实体package com.demo.dto;public class User { private Integer
- 1.什么是接口隔离原则?客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口范围上。2.对应代码上面这张图呢,就违反
- SpringBoot 中使用activeMq的步骤:1、pom中引入jar包: <dependency>  
- 前言本文主要给大家介绍了关于Java中Unsafe类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧1.Unsaf
- 源代码:http://github.com/lovewenyo/HttpDemo1. HttpURLConnection使用JDK原生提供的
- 一、length()返回此字符串的长度public static void main4(String[] args) { &n
- 一、工具类代码public class TaskHelper {#region 多线程操作 &nbs
- 启动类的存放位置今天,写了一个项目,但是启动类为什么一直报错我是放在这个位置的,但是就一直报放在默认包错误 想记录下微服务启动类的
- Android现在实现Tab类型的界面方式越来越多,今天就把常见的实现方式给大家来个总结。目前写了:1、传统的ViewPager实现2、Fr
- Unity Shader学习:玻璃材质,供大家参考。主要是通过反射和折射来达到透明的效果,用菲涅尔来混叠。shader部分:Shader &
- 前言废话不多说直接开始老规矩,文章最后有源码完成效果图棋子加渐变色棋子不加渐变色一、测量1.获取宽高 @Override protected
- 以下图中TV VOD两个按键为例,文章中所涉及到的文件只写文件名,因每个方案的路径各不相同,请自行全局搜索文件。 1.获取按键的扫
- 前言:阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。如果同步代码块中的内容过于简单,状态转换消
- 1.)说明.本项目是来自github上的一个项目roottools (https://github.com/Stericson/RootTo