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

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

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

摘要:本文将对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.mzph.cn/diannao/61909.shtml

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

相关文章

提升数据分析效率:Excel Power Query和Power Pivot的妙用

在日常工作中&#xff0c;微软的Excel Power Query和Power Pivot是提升数据处理和分析效率的利器。他们的特点也各不相同&#xff0c;Power Query侧重数据的高效导入与清洗&#xff0c;Power Pivot更测试数据建模与复杂计算。下面将介绍它们各自的功能&#xff0c;并提供应用案…

在 Spring Boot 中实现多种方式登录(用户名、手机号、邮箱等)的不正经指南

欢迎来到一场技术与幽默交织的冒险&#xff01;今天&#xff0c;我们将跳进 Spring Boot 的世界&#xff0c;探索如何通过 用户名、手机号、邮箱 等多种方式实现登录。想象一下&#xff0c;用户在登录时可以随心所欲地选择——就像你今天早上纠结到底是要喝美式咖啡还是拿铁&am…

认识RabbitMq和RabbitMq的使用

1 认识RabbitMq RabbitMQ是⼀个消息中间件&#xff0c;也是⼀个生产者消费者模型&#xff0c;它负责接收&#xff0c;存储并转发消息。 2.1 Producer和Consumer Producer&#xff1a;生产者&#xff0c;是RabbitMQServer的客户端&#xff0c;向RabbitMQ发送消息 Consumer&…

性能测试及调优

一、性能测试介绍 1、什么叫做性能测试&#xff1f; &#xff08;1&#xff09;通过某些工具或手段来检测软件的某些指标是否达到了要求&#xff0c;这就是性能测试 &#xff08;2&#xff09;指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指…

代码纪元——源神重塑无序

简介 源神&#xff0c;真名为张晨斌&#xff0c;原为代码宇宙创世四神之一。代码宇宙在创造之初时空无一物&#xff0c;只有复杂且繁琐的底层代码&#xff0c;智慧神灵每日都困在诸如脚本等复杂的底层框架之中&#xff0c;源神面对这种局面非常不满意&#xff0c;于是源神通过大…

LVGL加载器,led和列表学习(基于正点原子)

加载器部件&#xff08;lv_spinner&#xff09; 加载器部件常用于提示当前任务正在加载。 加载器部件组成部分&#xff1a; 主体(LV_PART_MAIN) 指示器(LV_PART_INDICATOR) 手柄(LV_PART_KNOB) 知识点1&#xff1a;创建加载器部件 lv_obj_t *spinner lv_spinner_creat…

内存不足引发C++程序闪退崩溃问题的分析与总结

目录 1、内存不足一般出现在32位程序中 2、内存不足时会导致malloc或new申请内存失败 2.1、malloc申请内存失败&#xff0c;返回NULL 2.2、new申请内存失败&#xff0c;抛出异常 3、内存不足项目实战案例中相关细节与要点说明 3.1、内存不足导致malloc申请内存失败&#…

docker搭建私有的仓库

docker搭建私有仓库 一、为什么要搭建私有的仓库&#xff1f; 因为在国内&#xff0c;访问&#xff1a;https://hub.docker.com/ 会出现无法访问页面。。。。&#xff08;已经使用了魔法&#xff09; 当然现在也有一些国内的镜像管理网站&#xff0c;比如网易云镜像服务、Dao…

Http 转 https 中 Nginx 的详细配置过程

摘要 本节将简要介绍从 HTTP 到 HTTPS 的配置过程&#xff0c;并完整展示 Nginx 的相关配置信息。 经过两天断断续续的调试&#xff0c;终于将 http 变成 https 了。现在说说这个安装 ssl 证书的过程。 服务器是在某云上。这个过程大致分为三个步骤&#xff1a;申请 ssl 证书、…

神经网络12-Time-Series Transformer (TST)模型

Time-Series Transformer (TST) 是一种基于 Transformer 架构的深度学习模型&#xff0c;专门用于时序数据的建模和预测。TST 是 Transformer 模型的一个变种&#xff0c;针对传统时序模型&#xff08;如 RNN、LSTM&#xff09;在处理长时间依赖、复杂数据关系时的限制而提出的…

【Linux】安装cuda

一、安装nvidia驱动 # 添加nvidia驱动ppa库 sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update# 查找推荐版本 sudo ubuntu-drivers devices# 安装推荐版本 sudo apt install nvidia-driver-560# 检验nvidia驱动是否安装 nvidia-smi 二、安装cudatoolkit&…

go-web项目通用脚手架

前言 构建go-web项目时&#xff0c;在编写业务逻辑代码之前&#xff0c;还需搭建脚手架&#xff08;框架&#xff09;&#xff1a;进行编写配置文件、整合web框架&#xff08;gin框架&#xff09;和数据库框架&#xff08;sqlx&#xff09;等&#xff0c;搭建脚手架的过程就类…

深度学习图像视觉 RKNN Toolkit2 部署 RK3588S边缘端 过程全记录

深度学习图像视觉 RKNN Toolkit2 部署 RK3588S边缘端 过程全记录 认识RKNN Toolkit2 工程文件学习路线&#xff1a; Anaconda Miniconda安装.condarc 文件配置镜像源自定义conda虚拟环境路径创建Conda虚拟环境 本地训练环境本地转换环境安装 RKNN-Toolkit2&#xff1a;添加 lin…

论文模型设置与实验数据:scBERT

Yang, F., Wang, W., Wang, F. et al. scBERT as a large-scale pretrained deep language model for cell type annotation of single-cell RNA-seq data. Nat Mach Intell 4, 852–866 (2022). https://doi.org/10.1038/s42256-022-00534-z 论文地址&#xff1a;scBERT as a…

Jenkins的环境部署

day22 回顾 Jenkins 简介 官网Jenkins Jenkins Build great things at any scale The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project. 用来构建一切 其实就是用Java写的一个项目…

怎么编译OpenWrt镜像?-基于Widora开发板

1.准备相应的环境&#xff0c;我使用的环境是VMware16ubuntu20.04&#xff0c;如图1所示安装编译所需的依赖包&#xff1b; sudo apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-…

拉格朗日乘子(Lagrange Multiplier)是数学分析中用于解决带有约束条件的优化问题的一种重要方法,特别是SVM

拉格朗日乘子&#xff08;Lagrange Multiplier&#xff09;是数学分析中用于解决带有约束条件的优化问题的一种重要方法&#xff0c;也称为拉格朗日乘数法。 例如之前博文写的2月7日 SVM&线性回归&逻辑回归在支持向量机&#xff08;SVM&#xff09;中&#xff0c;为了…

Python 获取微博用户信息及作品(完整版)

在当今的社交媒体时代&#xff0c;微博作为一个热门的社交平台&#xff0c;蕴含着海量的用户信息和丰富多样的内容。今天&#xff0c;我将带大家深入了解一段 Python 代码&#xff0c;它能够帮助我们获取微博用户的基本信息以及下载其微博中的相关素材&#xff0c;比如图片等。…

# linux 清理指定目录下,指定时间的历史文件

如何使用这个脚本 1、创建脚本 cleanup.sh #!/bin/bash# 默认值 DEFAULT_DIR"/path/to/default/directory" DEFAULT_DAYS7# 使用方法提示 usage() {echo "Usage: $0 [-d directory] [-t days]"echo " -d 目标目录 (默认为: ${DEFAULT_DIR})"…

MySQL的DELETE(删除数据)详解

MySQL的DELETE语句用于从数据库表中删除记录。与UPDATE语句类似&#xff0c;DELETE语句也非常强大&#xff0c;支持多种用法和选项。本文将详细介绍DELETE语句的基本语法、高级用法、性能优化策略以及注意事项。 1. 基本语法 单表删除 单表删除的基本语法如下&#xff1a; …