算法编程题-寻找最近的回文数

news/2024/11/26 9:53:44/

算法编程题-寻找最近的回文数

      • 原题描述
      • 思路简述
      • 代码实现
      • 复杂度分析
      • 参考

摘要:本文将对LeetCode 原题 564 寻找最近的回文数进行讲解,并且给出golang语言的实现,该实现通过了所有测试用例且执行用时超过100%的提交,最后给出相关的复杂度分析。
关键词算法、LeetCode、Golang、分情况讨论

原题描述

LeetCode 564 寻找最近的回文数: 给定一个表示数字的字符串n,求最近的回文数,如果有多个回文数与n的差的绝对值相等,则优先取较小的数。

思路简述

这道题相对比较复杂,没有任何的技巧,只是将所有情况考虑进去,需要分情况讨论所有情况,然后从这些情况下的回文数进行比较,选出最符合条件的。怎么去分情况讨论呢?
要构造一个比较接近的回文数,一种思路是将数都前半部分直接对应到后半部分,这样生成的既是一个回文数,相对来说比较地接近原来的回文数,这种能解决大部分问题,但是还存在一些特殊情况。一种是要将前半部分加一再对应到后半部分,还需要减一再对应到后半部分。此外,加一减一可能导致数位的变化,所以还要将位数减一的最大的回文数和位数加一最小的回文数也加入到待考虑的集合中。更加详细的过程请参考代码实现:

代码实现

func nearestPalindromic(n string) string {nums := []byte(n)m := len(nums)flag := falsebackUpNums := make([]string, 0)for i := m - 1; i >= m/2; i-- {if nums[i] != nums[m-1-i] {flag = truenums[i] = nums[m-1-i]}}if flag { // flag标识是否有修改backUpNums = append(backUpNums, string(nums))}// 考虑将前半部分加一后构造c := byte(1)for i := m / 2 + m % 2 - 1; i >= 0; i-- {nums[i] += cif nums[i] > '9' {nums[i] -= 10c = 1} else {break}}for i := m - 1; i >= m / 2; i-- {nums[i] = nums[m - 1 - i]}backUpNums = append(backUpNums, string(nums))// 考虑将前半部分减一后构造nums = []byte(n)c = byte(1)for i := m / 2 + m % 2 - 1; i >= 0; i-- {nums[i] = nums[i] + 10 - cif nums[i] > '9' {nums[i] -= 10break} else {c = 1}}for i := m - 1; i >= m / 2; i-- {nums[i] = nums[m - 1 - i]}backUpNums = append(backUpNums, string(nums))// 再加上两个位数加一减一的回文数backUpNums = append(backUpNums, buildMaxPalind(m - 1), buildMinPalind(m + 1))res := ""for _, num := range backUpNums {if res == "" || less(strSub(n, num), strSub(n, res)) || ((strSub(n, num) == strSub(n, res) && less(num, res))) { {res = num}}return res
}func buildMaxPalind(n int) string {if n == 0 {return "0"}res := make([]byte, n)for i := 0; i < n; i++ {res[i] = '9'}return string(res)
}func buildMinPalind(n int) string {if n == 0 {return "0"}res := make([]byte, n)for i := 0; i < n; i++ {res[i] = '0'}res[0] = '1'res[n - 1] = '1'return string(res)
}// strSub 字符串加减
func strSub(str1, str2 string) string {if str1 == str2 {return "0"}if less(str1, str2) {return strSub(str2, str1)}m := len(str1)n := len(str2)res := make([]byte, m)k := m - 1i := m - 1j := n - 1c := byte(0)for i >= 0 || j >= 0 {t := str1[i] + 10 - cif j >= 0 {t -= str2[j]}if t > 9 {t -= 10c = 0} else {c = 1}if t < '0' {t += '0'}res[k] = tk--i--j--}for res[k + 1] == '0' && k < m - 1 {k++}return string(res[k+1:])
}// less 返回str1 是否小于str2
func less(str1, str2 string) bool {m := len(str1)n := len(str2)if m < n {return true}if m > n {return false}for i := 0; i < m; i++ {if str1[i] > str2[i] {return false} else if str1[i] < str2[i] {return true}}return false
}

在这里插入图片描述

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),n为字符串数字的长度
  • 空间复杂度: O ( n ) O(n) O(n),也可以实现 O ( 1 ) O(1) O(1)

参考

  • 寻找最近的回文数

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

相关文章

非递归遍历二叉树(数据结构)

我的博客主页 非递归遍历二叉树 前序遍历&#xff08;迭代&#xff09;中序遍历&#xff08;迭代&#xff09;后续遍历&#xff08;迭代&#xff09; 二叉树的遍历方式有&#xff1a;前序遍历、中序遍历、后续遍历&#xff0c;层序遍历&#xff0c;而树的大部分情况下都是通过递…

YOLO 从标注到模型训练与检测

本篇文章将带你从数据标注开始&#xff0c;经过数据集转换和划分&#xff0c;最后训练 YOLO 模型并进行检测。包括必要的代码示例&#xff0c;以及路径和文件的详细说明&#xff0c;以帮助你完成整个流程。 1. 数据标注 首先&#xff0c;我们需要对目标检测的数据进行标注。这…

lvgl学习复选框部件和进度条部件(基于正点原子)

复选框部件&#xff08;lv_checkbox&#xff09; 复选框部件常用于选择某个内容的开启和关闭&#xff0c;可以理解为自带标签的开关。 复选框部件组成部分&#xff1a; 主体(LV_PART_MAIN) 勾选框(LV PART INDICATOR) 知识点1&#xff1a;创建复选框部件 lv_obj_t *check…

lambda的作用

lambda 的定义 lambda 是 Python 中用于创建匿名函数的关键字。匿名函数是一种没有名字的函数&#xff0c;通常用来定义简单的、一次性的函数。 lambda 的语法 lambda 参数列表: 表达式 参数列表: 函数的输入&#xff0c;可以有多个&#xff0c;用逗号分隔。表达式: 函数的…

前端高能组件库 Shadcn-UI

你是不是用 element-ui 或者 ant-design &#xff0c;然后&#xff0c;开发时常常遇到需要匹配设计稿时调样式的痛苦。 Shadcn-UI 结合tailwindcss &#xff0c;即可与让你享受组件同时随意的设置样式。 支持 VUE 官方地址&#xff1a;shadcn/ui 项目地址&#xff1a;https:…

极客时间《Redis核心技术与实战》开篇词 知识点总结

Redis 主要的数据持久化方式 RDB&#xff08;Redis Database Backup file&#xff09; RDB 是 Redis 提供的一种数据快照持久化方式&#xff0c;它会在指定的时间间隔内生成数据集的时间点快照&#xff0c;并将这些快照保存到磁盘上的一个 RDB 文件中。RDB 文件是一个压缩的二…

Docker 配置 HTTP 和 HTTPS 网络代理

前言 在内网环境中&#xff0c;为了实现全局代理上网&#xff0c;Linux 系统通常通过修改 .bashrc 或 /etc/profile 等文件&#xff0c;设置 HTTP 和 HTTPS 代理。这种方式可以为大多数应用提供代理支持&#xff0c;但 Docker 并不会自动读取系统的环境变量&#xff0c;因此需…

谷粒商城-消息队列Rabbitmq

RabbitMq参考文档 在谷粒商城项目中使用消息队列主要有以下几个重要原因&#xff1a; 异步处理提高性能 场景示例&#xff1a;在订单系统中&#xff0c;当用户提交订单后&#xff0c;系统需要完成多个操作&#xff0c;如更新库存、生成订单记录、发送订单通知等。如果这些操作…