906. 超级回文数

1. 题目

906. 超级回文数

2. 解题思路

题目意思很简单,在给定范围中找到所有满足,它本身是回文,且它的平方也是回文的数字个数。
这题需要注意题目给定的范围,后面很有用:
image.png
因为回文范围是有限的,那么我们可以先初始化基础情况,也就是枚举出单个数字,和两位数字的回文。
题目要求范围大于1,那么我们枚举的基础数字就是1-9,通过下面的代码就可以初始化好基础的回文。
image.png|700

然后我们针对每个回文进行判断,它的平方是不是回文,如果是就给结果加一。
如果当前回文数的长度是偶数,继续通过在中间插入一个或两个字符(从’0’到’9’)来生成新的、更长的回文数,并将它们加入队列。这样能够递归生成长度更长的回文数。
如果当前回文数的平方已经超出了范围 [left, right],则停止处理该回文数。
最后统计结果就好了。

3. 代码

3.1. 注意点

[!NOTE] 1、19行的tmp.length() > 10 这个判断条件是啥意思
[1, 10^18) 是题目给定的整数范围,超过这个范围的数值不需要再检查。而数字的长度超过10位的平方肯定超过了这个范围。
回文数长度达到11位,那么它的平方就会超过 10^22,远远超出题目要求的范围 10^18

[!NOTE] 2、24行的if (tmpNum * tmpNum < 0) 这个判断条件是啥意思
我们的tmpNum类型为Long,当tmpNum * tmpNum 的结果超过Long的最大值,那么就会溢出成负数,这种情况也没必要处理了。

[!NOTE] 3、为什么在处理当前数字为偶数的时候要插入字符,并且只插入1、2个字符,不插入3、4、5…个
因为回文是数字对称的,它往往可以直接在当前回文上进行插入来得到新回文,处理代码会尝试在当前偶数长度的回文数中间插入一个或两个数字,生成更长的回文数。这样做的目的是生成可能符合条件的下一个更长的回文数,并且保持回文数的对称性。

  • 插入一个 字符:生成奇数长度的回文数。例如从 "1221" 生成 "12321",这个新回文数的长度是奇数。
  • 插入两个相同的 字符:生成偶数长度的回文数。例如从 "1221" 生成 "123321",这个新回文数的长度是偶数。
    这种方式已经覆盖了常见的奇数和偶数长度回文数的情况,不需要再增加额外的插入方式。

3.2. 完整代码

class Solution {public int superpalindromesInRange(String left, String right) {Long l = Long.parseLong(left);Long r = Long.parseLong(right);int res = 0;String[] strs = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};Queue < String > queue = new LinkedList < > ();//L 和 R 是表示 [1, 10^18) 范围的整数的字符串。 所以i从1开始for (int i = 1; i < 10; i++) {queue.offer(strs[i]);queue.offer(strs[i] + strs[i]);}while (!queue.isEmpty()) {String tmp = queue.poll();if (tmp.length() > 10) {continue;}Long tmpNum = Long.parseLong(tmp);//处理溢出情况,tmp的平方有可能会大于Long的最大值if (tmpNum * tmpNum < 0) {continue;}if (tmpNum * tmpNum <= r) {StringBuilder sb = new StringBuilder();sb.append(tmpNum * tmpNum);//判断当前数字的平方是不是回文if (tmpNum * tmpNum >= l && sb.toString().equals(sb.reverse().toString())) {res++;}if (tmp.length() % 2 == 0) {//向当前回文数插入数字构造新的更长的回文数for (String c: strs) {queue.offer(tmp.substring(0, tmp.length() / 2) + c + tmp.substring(tmp.length() / 2));queue.offer(tmp.substring(0, tmp.length() / 2) + c + c + tmp.substring(tmp.length() / 2));}}}}return res;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149492.html

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

相关文章

红外热成像应用场景!

1. 电力行业 设备故障检测&#xff1a;红外热成像仪能够检测电气设备&#xff08;如变压器、电线接头&#xff09;的过热现象&#xff0c;及时发现并定位故障点&#xff0c;预防火灾等安全事故的发生。 水电站查漏&#xff1a;在水电站中&#xff0c;红外热成像仪可用于快速查…

汇成百年公益迭代3.0:从捐到助再到创

创业的终极目的是什么&#xff1f; 在汇成百年教育创始人周文强的创业七步法中&#xff0c;实现企业自动化运转、财富自由之后&#xff0c;创业的最后一步是回馈社会、做慈善。 &#xff08;2024年2月周文强成为《商界》封面人物&#xff09; 周文强一直身体力行地在实践着。…

网络服务管理

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 # 学习方法&#xff1a; ## 当天…

巧用服务名解决主备集群中主库DMDSC节点间会话负载不均衡的问题

一、背景描述 为了实现数据的冗余&#xff0c;同时为了保护数据的安全&#xff0c;实现业务系统数据在两个机房间保持一致&#xff0c;需要在同城异地机房搭建备库。某金融客户业务系统将两节点DMDSC集群改造成两节点DMDSC主单机备集群后&#xff0c;进行功能测试时&#xff0…

2024年增量学习(二) l2p的jax版代码分析

背景介绍 l2p有两个代码实现&#xff0c;官方的jax实现&#xff0c;和个人开源的pytorch实现。两种实现有若干区别&#xff0c;而在jax实现中能看到replay和review机制。 训练机制 先跳过繁琐的代码实现&#xff0c;介绍一下jax版实现的训练机制。以数据集cifar100为例&…

MODELS 2024震撼续章:科技与可持续性的未来交响曲

MODELS 2024国际会议正如火如荼地进行着&#xff0c;每一天都充满了新的发现与启迪&#xff0c;每一场分享都是对技术前沿的一次深刻探索&#xff0c;更是对现实世界可持续性挑战的一次积极回应。现在让我们继续这场科技盛宴&#xff0c;看看小编为您精选几场的学术分享吧~ 会议…

python如何实现日期加减

首先通过import datetime&#xff0c;导入日期处理库。 然后把日期转化成datetime标准格式&#xff0c;使用datetime.datetime.strptime()方法将字符串格式的时间转化为标准格式。 其中"%Y/%m/%d %H:%M:%S"为time字符串的时间格式&#xff1a;Y为年&#xff0c;m为月…

请不要在TS中使用Function类型

在 TypeScript 中&#xff0c;避免使用 Function 作为类型。Function 代表的是“任意类型的函数”&#xff0c;这会带来类型安全问题。对于绝大多数情况&#xff0c;你可能更希望明确地指定函数的参数和返回值类型。 如果你确实想表达一个可以接收任意数量参数并返回任意类型的…

Android13中Android.mk和Android.bp预编译多种架构文件

需求&#xff1a; 1&#xff0c; 当前有多个架构的config文件&#xff0c;但是需要不同架构使用不同config文件 2&#xff0c; 必须将config文件拷贝到out/host目录下 常规思路 在Android.bp中&#xff0c; 一般在编译多架构文件时&#xff0c;都会使用arch属性&#xff…

Stable Diffusion绘画 | XYZ Plot:让对比一目了然

XYZ Plot 是 SD 自带的&#xff0c;无需额外安装。 它的作用&#xff0c;是给我们用来对比不同参数下&#xff0c;生成图片效果的区别。 位置在页面左侧底部&#xff1a; 实操 开启 x轴进行对比&#xff0c;这里面有各种可选的对比参数&#xff1a; 现在 X轴类型 选择「Sampler…

【秋招笔试题】阵营分配

解法&#xff1a;简单背包题。 def solve(nums):n len(nums)totalSum sum(nums)dp [[False] * (totalSum // 2 1) for _ in range(n 1)]for i in range(n 1):dp[i][0] Truefor i in range(1, n 1):for j in range(1, totalSum // 2 1):if nums[i - 1] < j:dp[i][j…

网上超市开发:SpringBoot技术要点

3 系统分析 这部分内容虽然在开发流程中处于最开始的环节&#xff0c;但是它对接下来的设计和实现起着重要的作用&#xff0c;因为系统分析结果的好坏&#xff0c;将直接影响后面环节的开展。 3.1可行性研究 影响系统开发的因素有很多&#xff0c;比如开发成本高就不适合开展&a…

Skyeye 云智能制造 v3.14.6 发布,ERP 商城

Skyeye 云智能制造&#xff0c;采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…

基于STM32的点滴输液报警器-设计说明书

设计摘要&#xff1a; 本文介绍了基于STM32微控制器的点滴输液报警器的设计与实现。点滴输液是医疗领域中常见的治疗方式&#xff0c;但输液速度的控制对患者的安全和治疗效果至关重要。因此&#xff0c;设计一种能够监测输液速度并在异常情况下发出警报的系统显得十分必要。基…

Linux:进程间通信之命名管道

Linux&#xff1a;进程间通信-CSDN博客 我们说匿名管道只能用于父子进程这样的关系通信&#xff0c;那么陌生进程怎么通信&#xff1f; 我们之前说父子进程能通信的最关键的地方就在于子进程复制了一份父进程的files_struct&#xff0c;从而通过文件的inode映射同一份文件来通…

Serilog文档翻译系列(五) - 编写日志事件

日志事件通过 Log 静态类或 ILogger 接口上的方法写入接收器。下面的示例将使用 Log 以便语法简洁&#xff0c;但下面显示的方法同样可用于接口。 Log.Warning("Disk quota {Quota} MB exceeded by {User}", quota, user); 通过此日志方法创建的警告事件将具有两个相…

亿发零售云解析:新零售破局与年轻群体消费趋势变化

近年来&#xff0c;随着数字化、智能化的快速发展&#xff0c;“新零售”概念逐渐成为商业领域的热门话题。相比传统零售&#xff0c;新零售通过线上与线下的深度融合&#xff0c;利用大数据、人工智能等技术&#xff0c;赋能消费者与品牌之间的互动。尤其在年轻消费群体中&…

JS 特殊运算符有哪些?

JavaScript 特殊运算符有哪些&#xff1f; 众多编程语言之中JavaScript &#xff0c;以其强大而全面的功能深受前端开发者喜爱。其丰富的运算符集&#xff0c;不仅包括了广泛应用的算术运算符、比较运算符以及逻辑运算符&#xff0c;还蕴藏着一系列较为冷门但同样功能强大的运算…

LVGL第一篇-了解lvgl显示原理以及使用C++移植

一、引言 在当今嵌入式系统与图形界面开发的广阔领域中&#xff0c;轻量级图形库 LVGL&#xff08;Light and Versatile Graphics Library&#xff09;恰似一颗璀璨耀眼的明星&#xff0c;正日益受到开发者们的热烈推崇与追逐。它以小巧精致之姿、高效卓越之能以及丰富多元之功…

Qt_事件的介绍

目录 1、理解事件 2、处理事件QEvent 3、键盘事件QKeyEvent 4、鼠标事件QMouseEvent 4.1 鼠标点击事件 4.2 鼠标释放事件 4.3 鼠标移动事件 5、滚轮事件QWheelEvent 6、定时器事件QTimerEvent 7、窗口事件QMoveEvent 8、事件分发器event 9、事件过滤器even…