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

news2024/11/17 13:11:36

文章目录

    • 一、题目
    • 二、我的解答:逐个判断对应位置的首末数字是否相同
    • 三、其他解答
      • 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 的长度 length
            int length=1;
            while(x/int(pow(10,length))>=10){
                length++;
            }
            length++;

            //逐个判断对应位置的首末数字是否相同,如 12345 中的 1-5和2-4
            for(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.coloradmin.cn/o/496637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++复习1】程序结构和C++的工作原理

如果你是一名newbird的话&#xff0c;建议先看如下的视频加深理解后&#xff0c;再看下面的内容&#xff1a; https://www.bilibili.com/video/BV1N24y1B7nQ?p6 声明 以下的内容均由chatGpt编写与对上面这个视频进行总结生成&#xff0c;我就只负责改改格式。 C的工作原理 …

Live800:在线客服系统对客服管理有哪些好处?

互联网的不断发展&#xff0c;让越来越多的企业开始使用在线客服系统来提高客户服务质量。但是&#xff0c;很多人并不了解在线客服系统对客服管理的好处。本文将介绍在线客服系统的一些能够提高客服管理效率和提升用户满意度的管理功能。 实时客服监控 在线客服系统可以实时监…

MPU6050详解(含源码)

前言&#xff1a;MPU6050是一款强大的六轴传感器&#xff0c;需要理解MPU6050首先得有IIC的基础&#xff0c;MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器&#xff0c;并且含有一个第二 IIC 接口&#xff0c;可用于连接外部磁力传感器&#xff0c;内部有硬件算法支持. 1…

JumpServer Harbor

Jumpserver是一款开源的堡垒机&#xff0c;可使系统的管理员和开发人员安全的连接到企业内部服务器上执行操作&#xff0c;并且支持大部分操作系统&#xff0c;是一款非常安全的远程连接工具 安装JumpServer jumpserver.org官网去下载安装&#xff0c;有一键安装&#xff08;里…

【回溯篇(3)---最少城市数】

1、最少城市数 【题目】 下图表示的是从城市A到城市H的交通图。从图中可以看出&#xff0c;从城市A到城市H要经过若干个城市。现要找出一条经过城市最少的一条路线。 【算法分析】 看到这图很容易想到用邻接距阵来表示&#xff0c;0表示能走&#xff0c;1表示不能走。如图。…

BM14 链表的奇偶重排

链表的奇偶重排_牛客题霸_牛客网 (nowcoder.com) 双指针解决 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#x…

Android 9.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析

1.前言 在android9.0的系统rom定制化开发中,在系统原生systemui进行自定义下拉状态栏布局的定制的时候,需要在systemui下拉状态栏下滑的时候,根据下滑坐标来 判断当前是滑出通知栏还是滑出控制中心模块,所以就需要根据屏幕宽度,来区分x坐标值为多少是左滑出通知栏或者右…

Linux_红帽8学习笔记分享_9(文件系统管理FS Management与swap交换分区管理)

Linux_红帽8学习笔记分享_9(文件系统管理FS Management与swap交换分区管理) 文章目录 Linux_红帽8学习笔记分享_9(**文件系统管理FS Management与swap交换分区管理**)1.fdisk分区命令的使用技巧1.1 创建大小为100M,200M,300M,400M,500M的5个磁盘分区(MBR分区表类型)1.2创建大小…

固态继电器的优点

固态继电器的优点包括紧凑性、抗冲击性和长寿命。以下是这些 SSR 优势中最重要的优势&#xff0c;让您了解为什么这项技术最适合您的应用&#xff1a; 开关速度快 固态继电器器件的主要优点之一是其开关速度。由于无需移动机械部件&#xff0c;SSR 可以在几微秒内切换。这是对…

详解MySQL慢SQL定位、分析

目录 1.概述 2.慢SQL定位 3.SQL性能分析 3.1.例子 3.2.SQL性能分析 3.3.参数说明 3.3.1.id 3.3.2.select_type 3.3.3.key_len 3.3.4.rows 3.3.5.type 3.3.6.extra 1.概述 解决慢SQL的问题无非散步&#xff0c;定位慢SQL、分析慢SQL、优化慢SQL&#xff0c;本文将按…

高效提升计算质量!瑞典量子计算机首次应用于化学

​ &#xff08;图片来源&#xff1a;网络&#xff09; 量子计算机可以模拟化学过程&#xff0c;从新药开发到新材料的方方面面&#xff0c;它都能带来重大影响&#xff0c;人们对此寄予厚望。在瑞典&#xff0c;查尔姆斯理工大学的研究人员首次使用量子计算机在实际化学中进行…

PyQt5桌面应用开发(9):经典布局QMainWindow

本文目录 PyQt5桌面应用系列桌面程序基本布局QMainWindow概况与使用主窗体菜单栏工具栏停靠窗状态栏 代码编辑器的例子总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件循…

113-Linux_安装c/c++开发库及连接mysql数据库

文章目录 一.安装c/c开发库二.连接mysql数据库三.用户的管理与授权 mysql数据库的安装 一.安装c/c开发库 安装开发c/c的库&#xff0c;命令&#xff1a;apt install libmysqlclient-dev 二.连接mysql数据库 #include<stdio.h> #include<mysql/mysql.h>void fun…

JAVA13新特性

JAVA13新特性 概述 2019年9月17日&#xff0c;国际知名的OpenJDK开源社区发布了Java编程语言环境的最新版本OpenJDK13。 Features&#xff1a;总共有5个新的JEP(JDK Enhancement Proposals): http://openjdk.java.net/projects/jdk/13/Features 350:Dynamic CDS Archives 动…

C++ STL之vector基础

文章目录 前言STL之vector基础1. What&#xff1a;什么是 vector&#xff1f;2. Why&#xff1a;为什么使用 vector&#xff1f;3. How&#xff1a;怎么使用vector?3.1 vector的定义演示&#xff1a;输出&#xff1a; 3.2 vector iterator 的使用演示&#xff1a;输出&#xf…

网络基础学习:什么是tcp/ip协议

什么是tcp/ip协议 TCP/ip协议是什么东西&#xff1f;tcp/ip四层模型一、应用层二、传输层三、网络层四、网络接口层 TCP/ip协议是什么东西&#xff1f; TCP/IP是一种网络协议套件&#xff0c;它由传输控制协议&#xff08;TCP&#xff09;和互联网协议&#xff08;IP&#xff…

最大网络流算法之dinic算法详解

1、题目描述 On the Internet, machines (nodes) are richly interconnected, and many paths may exist between a given pair of nodes. The total message-carrying capacity (bandwidth) between two given nodes is the maximal amount of data per unit time that can b…

2016年上半年软件设计师下午试题

试题四 【说明】 模式匹配是指给定主串t和子串s&#xff0c;在主串 t 中寻找子串s的过程&#xff0c;其中s称为模式。如果匹配成功&#xff0c;返回s在t中的位置&#xff0c;否则返回-1 。 KMP算法用next数组对匹配过程进行了优化。KMP算法的伪代码描述如下&#xff1a; 在串…

【Python入门】Python的判断语句(if语句的基本格式)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

如何使用SpringMVC之常用注解

❣️关注专栏&#xff1a;JavaEE Spring MVC ⌛️ 1. Spring MVC 创建和连接⌛️ 1.1 RequestMapping⌛️ 1.2 GetMapping⌛️ 1.3 PostMapping ⌛️ 2. 获取参数⌛️ 2.1 传递/获取单个参数⌛️ 2.2 传递/获取多个参数⌛️ 2.3 传递/获取对象⌛️ 2.4 参数重命名⌛️ 2.4.1 …