A.每日一题:3517. 最小回文排列 I

发布时间:2026/9/27 12:41:58

A.每日一题:3517. 最小回文排列 I
题目链接3517. 最小回文排列 I中等算法原理解法一计数排序时间复杂度O(N)写法一StringBuffer79ms击败5.76%1.思路很简单利用计数排序的思想既然字符串给的是回文的那么我们只需要统计前一半就行了统计前一半中26个小写英文字符出现的次数然后从 a 遍历到 z 依次拼接即可2.拼接之后后半部分就直接翻转过来再接上这一点用 StringBuffer 可以很简单的实现3.最后一点就是看这个回文串长度是奇数还是偶数我们上述做法得到的回文串必定是偶数的如果是奇数的话差的一定是中间的那个而中间的那个在最终结果的位置必然还是在中间否则这个字符串必然不再是回文因此我们直接把原字符串的正中间的字符取出来接在中间即可4.最后根据原字符串的奇偶长度返回不同的结果即可写法二StringBuilder33ms击败54.86%思路与写法一完全相同但这个会更快因为 StringBuffer 是线程安全的中间加了很多锁而 StringBuffer 是线程不安全的没有那么多锁效率要比 StringBuffer 快不少关于线程中上锁的知识可参考Java EE2.多线程-初阶第四弹synchronized 锁内存可见性Java EE3.多线程-进阶第一弹常见的锁策略synchronized原理优化16ms击败98.96%中间重复添加相同字符的部分可以借助 repeat 实现String a a; String fiveAs a.repeat(5); // 结果就是 aaaaa解法二排序左半部分48ms击败15.03%时间复杂度O(n logn)由于 s 是回文字符串我们只需关心左半部分如何排列即可因此我们可以将左半部分拿出来排列后在用 StringBuilder 拼接上去后半部分只需要逆序拼接即可Java代码class Solution { //3517. 最小回文排列 I //解法一计数排序-写法一StringBuffer public String smallestPalindrome(String s) { if(s.length()1) return s; int[] hashnew int[26]; StringBuffer curnew StringBuffer(); for(int i0;is.length()/2;i) hash[s.charAt(i)-a]; for(int i0;i26;i) while(hash[i]--0) cur.append((char)(ia)); if(s.length()%20) return cur.toString()cur.reverse().toString(); else return cur.toString()s.charAt(s.length()/2)cur.reverse().toString(); } }class Solution { //3517. 最小回文排列 I //解法一计数排序-写法二StringBuilder public String smallestPalindrome(String s) { if(s.length()1) return s; int[] hashnew int[26]; StringBuilder curnew StringBuilder(); for(int i0;is.length()/2;i) hash[s.charAt(i)-a]; for(int i0;i26;i) while(hash[i]--0) cur.append((char)(ia)); if(s.length()%20) return cur.toString()cur.reverse().toString(); else return cur.toString()s.charAt(s.length()/2)cur.reverse().toString(); } }class Solution { //3517. 最小回文排列 I //解法一计数排序-优化 public String smallestPalindrome(String s) { int ns.length(); if(n1) return s; int[] hashnew int[26]; StringBuilder curnew StringBuilder(); for(int i0;in/2;i) hash[s.charAt(i)-a]; for(int i0;i26;i) cur.repeat(ai,hash[i]); //提前拷贝一份 StringBuilder tnew StringBuilder(cur); //回文串长度为奇数就把中间的加上 if(n%21) cur.append(s.charAt(n/2)); cur.append(t.reverse()); return cur.toString(); } }class Solution { //3517. 最小回文排列 I //解法二排序左半部分 public String smallestPalindrome(String s) { int ns.length(); int mn/2; char[] ts.substring(0,m).toCharArray(); Arrays.sort(t); StringBuilder curnew StringBuilder(); cur.append(t); //判断是否是奇数长度回文串 if(n%21) cur.append(s.charAt(m)); //逆序拼接 for(int im-1;i0;i--) cur.append(t[i]); return cur.toString(); } }

相关新闻

全球半导体加热器行业市场深度研判:2026-2032期间年复合增长率(CAGR)为17.6%

全球半导体加热器行业市场深度研判:2026-2032期间年复合增长率(CAGR)为17.6%

2026/8/24 23:45:54

QYResearch调研显示,2025年全球半导体加热器市场规模大约为14.19亿美元,预计2032年将达到43.56亿美元,2026-2032期间年复合增长率(CAGR)为17.6%。纵观行业发展,当前半导体加热器呈现新能源驱动、技术迭代快…

Unity高性能滚动列表开发:FancyScrollView核心架构与实战指南

Unity高性能滚动列表开发:FancyScrollView核心架构与实战指南

2026/8/22 22:53:19

1. 项目概述:为什么我们需要FancyScrollView? 在Unity UI开发中,滚动列表(ScrollView)是展示大量数据最核心的组件之一。无论是游戏中的背包、排行榜,还是应用中的聊天记录、商品列表,都离不开它…

抖音位置如何修改,一款软件全部 OK

抖音位置如何修改,一款软件全部 OK

2026/8/26 19:40:58

前言不少短视频创作者会寻找位置更改工具,用来调整抖音展示的地理点位,天下游作为安卓领域运营已久的位置更改工具,经常被创作者拿来对比参考。本文就此开展客观技术层面科普,梳理这款软件自身特性、运行条件、优势与局限&#xf…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/26 19:14:12

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/27 1:30:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/27 1:30:37

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/27 1:30:35

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/27 1:30:34

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/26 16:36:51

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/26 14:29:04

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/26 13:57:22

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/26 23:35:16

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…