豆包MarsCode:字符串字符类型排序问题

问题描述

在这里插入图片描述


思路分析

我们需要对字符串中的字母、数字、问号按照规则进行排序,具体要求是:

  1. 问号的位置不变
  2. 数字的位置不变,但数字之间要按照从大到小排序
  3. 字母的位置不变,但字母之间要按照字典序排序

解决此问题的思路分为以下几个步骤:

步骤 1:分离字符

遍历字符串,将字符分类存储:

  • 字母存入一个列表中,用于后续的字母排序。
  • 数字存入另一个列表中,用于后续的数字排序。
  • 问号保留原位,不动。

通过这一过程,我们可以分离出所有需要排序的字母和数字。

步骤 2:对字母和数字分别排序

  • 字母按字典序排序:直接调用 Java 的 Collections.sort() 方法对字母列表进行排序。
  • 数字按从大到小排序:对数字列表使用 Collections.sort() 并传入 Collections.reverseOrder(),实现降序排列。

排序的结果分别保存在两个列表中。

步骤 3:重新组装字符串

  1. 再次遍历输入字符串,按照字符类型插入对应的值:
    • 遇到字母时,从排序后的字母列表中取一个字母并插入到结果中。
    • 遇到数字时,从排序后的数字列表中取一个数字并插入到结果中。
    • 遇到问号时,直接在结果中保留问号。

通过这种方式,能够保持问号位置不变,同时按照要求对字母和数字进行了重新排序。


参考代码(Java)

import java.util.ArrayList;
import java.util.Collections;public class Main {public static String solution(String inp) {// 创建列表存储字母和数字ArrayList<Character> letters = new ArrayList<>();ArrayList<Character> digits = new ArrayList<>();// 遍历字符串,将字母和数字分离for (char ch : inp.toCharArray()) {if (Character.isLetter(ch)) {letters.add(ch);} else if (Character.isDigit(ch)) {digits.add(ch);}}// 对字母按字典序排序Collections.sort(letters);// 对数字按从大到小排序digits.sort(Collections.reverseOrder());// 用于重新组装字符串的StringBuilderStringBuilder result = new StringBuilder();// 分别维护字母和数字的索引int letterIndex = 0;int digitIndex = 0;// 遍历输入字符串,根据需要插入排序后的字母和数字for (char ch : inp.toCharArray()) {if (Character.isLetter(ch)) {result.append(letters.get(letterIndex++));} else if (Character.isDigit(ch)) {result.append(digits.get(digitIndex++));} else { // 问号保留原位result.append(ch);}}return result.toString();}public static void main(String[] args) {// 测试用例System.out.println(solution("12A?zc").equals("21A?cz"));System.out.println(solution("1Ad?z?t24").equals("4Ad?t?z21"));System.out.println(solution("???123??zxy?").equals("???321??xyz?"));}
}

代码分析

1. 方法声明和初始化

public static String solution(String inp) {// 创建列表存储字母和数字ArrayList<Character> letters = new ArrayList<>();ArrayList<Character> digits = new ArrayList<>();
  • 定义 solution 方法,用于实现字符串排序逻辑。
  • 初始化两个列表:
    • letters 用于存储所有字母。
    • digits 用于存储所有数字。

2. 遍历字符串,分类字符

for (char ch : inp.toCharArray()) {if (Character.isLetter(ch)) {letters.add(ch);} else if (Character.isDigit(ch)) {digits.add(ch);}
}
  • 遍历输入字符串 inp,使用 toCharArray() 转换成字符数组。
  • 对每个字符 ch
    • 如果是字母 (Character.isLetter(ch)),存入 letters
    • 如果是数字 (Character.isDigit(ch)),存入 digits
    • 问号等特殊字符直接跳过,不加入任何列表。

此步骤完成后:

  • 字母和数字被分离,分别存储在 lettersdigits 中。
  • 问号的位置没有被改变。

3. 对字母和数字排序

// 对字母按字典序排序
Collections.sort(letters);
// 对数字按从大到小排序
digits.sort(Collections.reverseOrder());
  • 调用 Collections.sort()letters 按字典序排序(从小到大)。
  • 使用 Collections.sort()digits 按降序排列(通过 Collections.reverseOrder() 实现)。

排序后的结果:

  • letters 按字母表顺序排列。
  • digits 从大到小排列。

4. 重新组装字符串

StringBuilder result = new StringBuilder();
int letterIndex = 0;
int digitIndex = 0;for (char ch : inp.toCharArray()) {if (Character.isLetter(ch)) {result.append(letters.get(letterIndex++));} else if (Character.isDigit(ch)) {result.append(digits.get(digitIndex++));} else { // 问号保留原位result.append(ch);}
}
  • 初始化 StringBuilder 用于存储最终的结果字符串。
  • 使用两个索引 letterIndexdigitIndex,分别跟踪 lettersdigits 列表中已插入的元素位置。

遍历输入字符串 inp 的每个字符:

  • 如果是字母,从 letters 中取出排序后的下一个字母,加入结果中。
  • 如果是数字,从 digits 中取出排序后的下一个数字,加入结果中。
  • 如果是问号,直接将问号添加到结果中,位置保持不变。

5. 返回结果字符串

return result.toString();
  • StringBuilder 转换为字符串并返回。

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

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

相关文章

[STM32 标准库]定时器输出PWM配置流程 PWM模式解析

前言&#xff1a; 本文内容基本来自江协&#xff0c;整理起来方便日后开发使用。MCU&#xff1a;STM32F103C8T6。 一、配置流程 1、开启GPIO&#xff0c;TIM的时钟 /*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟RCC_APB2PeriphClockC…

无人机红外热成像:应急消防的“透视眼”

无人机红外热成像&#xff1a;应急消防的“透视眼” 亲爱的小伙伴们&#xff0c;每年一到夏天&#xff0c;应急消防的战士们就像上紧了发条的闹钟&#xff0c;时刻准备应对各种灾害。炎热天气让火灾隐患“蹭蹭”往上涨&#xff0c;南北各地还有防洪救灾、台风、泥石流等灾害轮…

【Redis】常见面试题

什么是Redis&#xff1f; Redis 和 Memcached 有什么区别&#xff1f; 为什么用 Redis 作为 MySQL 的缓存&#xff1f; 主要是因为Redis具备高性能和高并发两种特性。 高性能&#xff1a;MySQL中数据是从磁盘读取的&#xff0c;而Redis是直接操作内存&#xff0c;速度相当快…

LLM - 大模型 ScallingLaws 的指导模型设计与实验环境(PLM) 教程(4)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145323420 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Scalin…

书生大模型实战营2

L0——入门岛 Python基础 Conda虚拟环境 虚拟环境是Python开发中不可或缺的一部分&#xff0c;它允许你在不同的项目中使用不同版本的库&#xff0c;避免依赖冲突。Conda是一个强大的包管理器和环境管理器。 创建新环境 首先&#xff0c;确保你已经安装了Anaconda或Minico…

力扣111二叉树的最小深度(DFS)

Problem: 111. 二叉树的最小深度 文章目录 题目描述思路复杂度Code 题目描述 思路 1.欲望求出最短的路径&#xff0c;先可以记录一个变量minDepth&#xff0c;同时记录每次当前节点所在的层数currentDepth 2.在递的过程中&#xff0c;每次递一层&#xff0c;也即使当前又往下走…

Scrapy如何设置iP,并实现IP重用, IP代理池重用

前置知识 1/3乐观锁 2/3 Scrapy流程(非全部) 3/3 关于付费代理 我用的"快代理", 1000个ip, 每个ip1min的有效期, 你用的时候, 把你的链接, 用户名填上去就行 设置代理IP &#x1f512; & 帮助文档: ①meta ②meta#proxy$ 语法: ①proxy的设置: Request对象中…

渗透测试-WAF是什么以及原理解释 waf功能详解

目录 waf功能介绍 waf出现的地点: 什么是waf 功能: 常见的系统攻击分为两类 一是利用Web服务器的漏洞进行攻击 二是利用网页自身的安全漏洞进行攻击 WAF主要功能&#xff1a; waf的特点1 waf主要功能2 网马木马主动防御及查杀 流量监控 网站漏洞防御功能 危险组件…

KF-GINS源码阅读

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、KF-GINS 简介1、程序概述2、相关资料3、文件结构4、第三方库 二、编译、调试三、类型定义1、核心类&#xff1a;GIEngine2、文件读写类型3、配…

基础项目实战——3D赛车(c++)

目录 前言一、渲染引擎二、关闭事件三、梯形绘制四、轨道绘制五、边缘绘制六、草坪绘制七、前后移动八、左右移动​九、曲线轨道​十、课山坡轨道​十一、循环轨道​十二、背景展示​十三、引入速度​十四、物品绘制​十五、课数字路障​十六、分数展示​十七、重新生成​十八、…

探索与创新:DeepSeek R1与Ollama在深度研究中的应用

在当今信息爆炸的时代&#xff0c;获取和处理信息的能力变得至关重要。特别是在学术和研究领域&#xff0c;如何有效地进行深度研究是一个亟待解决的问题。最近&#xff0c;一个名为DeepSeek R1的模型结合Ollama平台提供了一种创新的解决方案。本文将分析并解构这一新兴的研究工…

【Linux】gdb——Linux调试器

gdb使用背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g 选项 gdb使用方法 首先进入gdb gdb test_glist显示代码 断点 b 行…

【单链表算法实战】解锁数据结构核心谜题——环形链表

题目如下&#xff1a; 解题过程如下&#xff1a; 环形链表&#xff1a;尾结点的next指针不为空&#xff0c;而是指向链表中的任一结点。 思路&#xff1a;快慢指针&#xff0c;慢指针每次走一步&#xff0c;快指针每次走两步。快慢指针在环中追逐相遇&#xff0c;那么这个链表…

56. 合并区间

【题目】&#xff1a;56. 合并区间 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {// 按照左端点排序sort(intervals.begin(), intervals.end(), [&](vector<int> lhs, vector<int> rhs)…

01-硬件入门学习/嵌入式教程-CH340C使用教程

前言 CH340C广泛应用于DIY项目和嵌入式开发中&#xff0c;用于USB数据转换和串口通信。本文将详细介绍CH340C的基本功能、引脚接线及使用方法。 CH340C简介 CH340C是一款USB转TTL电平转换器&#xff0c;可以将电脑的USB数据转换成串口数据&#xff0c;方便与单片机&#xff…

深度学习|表示学习|卷积神经网络|详细推导每一层的维度变化|14

如是我闻&#xff1a; 一个经典的卷积神经网络&#xff08;CNN&#xff09;架构&#xff0c;呈现的是输入图像通过多个卷积层、池化层以及全连接层&#xff0c;最终输出分类结果的过程。整个过程的核心是理解输入特征图的尺寸如何在每一层发生变化&#xff0c;我们可以通过卷积…

5.1.4 软件工具+开发环境

文章目录 软件工具软件开发环境 软件工具 软件工具是辅助软件工程实施的软件&#xff0c;也叫CASE工具。软件工具可分为支持软件开发过程的工具、软件维护工具、软件管理工具3类。 支持软件开发过程的工具 需求分析工具&#xff1a;从需求定义制定出功能规范&#xff0c;描述软…

ospf动态路由配置,cost路径调整,ospf认证实验

一、实验拓扑如图&#xff1a; 接口ip配置网络 &#xff1a;10.17.12.* 10.17.13.* &#xff0c;10.17.23.* 回环接口配置分别为 10.0.1.1 &#xff0c;10.0.1.2&#xff0c;10.0.1.3对应三台路由器 ar1配置接口ip interface GigabitEthernet0/0/0 ip address 10.17.12.1…

通过亚马逊云科技Bedrock打造自定义AI智能体Agent(上)

大家对于智能体代理Agent一定已经非常熟悉&#xff0c;自主代理&#xff08;Autonomous Agents&#xff09; 目前在AI行业极其热门并具有巨大的潜力&#xff0c;能够显著提升开发者日常的工作效率、自动化日常琐碎、重复性任务&#xff0c;并生成全新的内容。Agent可以理解用户…

Sklearn 中的逻辑回归

逻辑回归的数学模型 基本模型 逻辑回归主要用于处理二分类问题。二分类问题对于模型的输出包含 0 和 1&#xff0c;是一个不连续的值。分类问题的结果一般不能由线性函数求出。这里就需要一个特别的函数来求解&#xff0c;这里引入一个新的函数 Sigmoid 函数&#xff0c;也成…