Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >上升下降字符串 | LeetCode

上升下降字符串 | LeetCode

作者头像
做棵大树
发布于 2022-09-27 11:58:43
发布于 2022-09-27 11:58:43
21100
代码可运行
举报
文章被收录于专栏:代码日志代码日志
运行总次数:0
代码可运行

“好久没刷 LeetCode 了,刚打开页面,啪,每日一题就显示出来了,很快啊。 ”

今天的每日一题是字符串的easy题目,可我还是花了有一二十分钟,许久不刷题手都生了。

题目 上升下降字符串

给你一个字符串 s ,请你根据下面的算法重新构造字符串:

  1. s 中选出 最小 的字符,将它 接在 结果字符串的后面。
  2. s剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。重复步骤 2 ,直到你没法从 s 中选择字符。
  3. s 中选出 最大 的字符,将它 接在 结果字符串的后面。
  4. s 剩余字符中选出 最大 的字符,且该字符比上一个添加的字符小,将它 接在 结果字符串后面。重复步骤 5 ,直到你没法从 s 中选择字符。
  5. 重复步骤 1 到 6 ,直到 s 中所有字符都已经被选过。

在任何一步中,如果最小或者最大字符不止一个 ,你可以选择其中任意一个,并将其添加到结果字符串。

请你返回将 s 中字符重新排序后的 结果字符串 。

示例一

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:s = "aaaabbbbcccc"
输出:"abccbaabccba"
解释:第一轮的步骤 123 后,结果字符串为 result = "abc"
    第一轮的步骤 456 后,结果字符串为 result = "abccba"
    第一轮结束,现在 s = "aabbcc" ,我们再次回到步骤 1
    第二轮的步骤 123 后,结果字符串为 result = "abccbaabc"
    第二轮的步骤 456 后,结果字符串为 result = "abccbaabccba"

示例二

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:s = "rat"
输出:"art"
解释:单词 "rat" 在上述算法重排序以后变成 "art"

思路

拿到题目后,首先到我脑海里的有一个 Map ,因为我们需要对输入中不同的字母进行标记(或者说计数)用于判断是否被拼接了;再者是一个先后顺序关系,我们可以从它提到的步骤中发现,选取最大的进行拼接,是在选取最小的进行拼接之后的,那么这个先后顺序我们就可以用于确定我们编写过程中的代码先后顺序。

之后我又想,Map 做映射确实好,但是它有个问题,是无序的;如果我们要找比当前最小大一点的字母则需要先标记当前字母,再去一一比对,这样找一个就要平均遍历 n/2 长度的字符串,时间上很不划算。

鉴于输入的有限性(只有26个英文字母),我们可以使用长度为 26 的数组 chars 来实现 Map 的功效,将 chars[i] 的值用字母出现的次数做填充,同时因为数组的有序性,我们相当于也已经对数组进行了排序操作。

分析完毕,上菜~

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public String sortString(String s) {
        int length = s.length();      // 个人习惯,也可以直接用 s.length()
        StringBuilder sb = new StringBuilder();
        int[] chars = new int[26];      // 用于实现 Map 的作用,并对字符进行排序
        
        for(int i = 0; i < length; i++){
            chars[s.charAt(i)-'a']++;     // 将字母进行映射并统计出现次数
        }

        while(sb.length() != length){     // 循环结束条件
            for(int i = 0; i < 26; i++){    // 寻找比当前字符大的字符,根据数组特性循环即可
                if(chars[i] > 0){
                    sb.append((char)(i+'a'));
                    chars[i]--;
                }
            }

            for(int i = 25; i >= 0; i--){    // 寻找比当前字符小的字符,从尾部循环即可
                if(chars[i] > 0){
                    sb.append((char)(i+'a'));
                    chars[i]--;
                }
            }
        }

        return sb.toString();
    }
}

讨论功能停止了,有更好方法的可以去查看原文评论哈

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 做棵大树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
上升下降字符串
题目挺长的,其实就是普通的字符串的操作,并且由于题目中说明了是纯小写字母,也就是总量是确定的,那么就可以不使用排序去统计数量,之后的操作正好也是顺序遍历与逆序遍历即可完成的操作,拼接字符串返回即可。首先定义一个纯对象作为哈希表来记录字符串每种字符的个数,之后定义小写字符的基准数值a的ASCII码值,之后构建一个26个小写字母的循环,将初始哈希表的键对应的值定义为0,循环字符串,将统计相应字母出现的次数,定义目标字符串,如果目标字符串与给定的字符串长度相等则退出循环,之后定义一个26字母正向循环,如果在哈希表中这个字母的值大于0则将其拼接到目标字符串并将该值减1,之后定义一个26字母的逆向循环,按照同样的规则将字符拼接,之后完成循环并返回目标字符串即可。
WindRunnerMax
2020/11/27
3100
【一天一大 lee】上升下降字符串 (难度:简单) - Day20201125
在任何一步中,如果最小或者最大字符不止一个,你可以选择其中任意一个,并将其添加到结果字符串。
前端小书童
2020/12/03
2940
【一天一大 lee】上升下降字符串 (难度:简单) - Day20201125
leetcode每日一题:1370. 上升下降字符串
https://leetcode-cn.com/problems/increasing-decreasing-string/
用户3578099
2020/12/14
3400
LeetCode-1370. 上升下降字符串(Java)
       哈喽,小伙伴们,我是bug菌呀👀。金三银四,又到了刷题月啦。所以不管你是准备跳槽还是在职,都一起行动起来,顺应这个时代月干点该干的事儿👣。所以,赶紧跟着bug菌的步伐卷起来吧⏰,变强从这一刻开始!➕🧈
bug菌
2023/08/24
1780
LeetCode-1370. 上升下降字符串(Java)
LeetCode 1370. 上升下降字符串
从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。
freesan44
2021/09/07
2450
LeetCode 1370. 上升下降字符串
LeetCode 第 21 场双周赛(779/1913,前40.7%)
全国排名:779 / 1913,40.7%;全球排名:2027 / 4729,42.8%
Michael阿明
2020/07/13
4030
码不停题:LeetCode75-Day2【字符串】
初始化两张哈希表,第一张哈希表 s2t 以 s中字符为键,映射至 t 的字符为值,第二张哈希表t2s 以 t 中字符为键,映射至 s 的字符为值
小熊学Java
2023/07/12
1360
码不停题:LeetCode75-Day2【字符串】
什么是基数排序?
老读者可能比较熟悉,刚开始的时候写了一个排序算法系列,把常见的排序算法都写了,有兴趣的可以在公众号内的目录菜单栏中选择数据结构与算法查看。
用户1260737
2019/11/12
1.1K0
LeetCode 2243. 计算字符串的数字和
文章目录 1. 题目 2. 解题 1. 题目 给你一个由若干数字(0 - 9)组成的字符串 s ,和一个整数。 如果 s 的长度大于 k ,则可以执行一轮操作。在一轮操作中,需要完成以下工作: 将 s 拆分 成长度为 k 的若干 连续数字组 ,使得前 k 个字符都分在第一组,接下来的 k 个字符都分在第二组,依此类推。注意,最后一个数字组的长度可以小于 k 。 用表示每个数字组中所有数字之和的字符串来 替换 对应的数字组。例如,“346” 会替换为 “13” ,因为 3 + 4 + 6 = 13 。 合并
Michael阿明
2022/05/10
4920
2024-07-20:用go语言,给定一个字符串 s, 依次遍历 ‘a‘ 到 ‘z‘, 每次操作删除 s 中出现位置最早的字符,
第一轮操作后,s = "aabcbbca",删除最早出现的 'a'、'b'、'c',得 s = "abbca"。
福大大架构师每日一题
2024/08/16
940
2024-07-20:用go语言,给定一个字符串 s, 依次遍历 ‘a‘ 到 ‘z‘, 每次操作删除 s 中出现位置最早的字符,
经典leetcode算法题分享(字符串)
很多人做leetcode题目找不到方向,或者说很难持之以恒,我这里推荐一种方法,从简单难度开始刷,刷完这个标签的简单难度,再换一个标签,这样循序渐进,把做题的量慢慢提高,还有难度逐渐加大。对于初学者,最重要是趁热打铁,而不是东打一枪西放一炮,趁热打铁才能形成做题的思路。
java技术爱好者
2021/03/15
5080
python leetcode 字符串相
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
py3study
2020/01/19
3370
LeetCode-字符串排序
# LeetCode-字符串排序 编写一个程序,将输入字符串中的字符按如下规则排序。 规则 1 :英文字母从 A 到 Z 排列,不区分大小写。 如,输入: Type 输出: epTy 规则 2 :同
benym
2022/07/14
3580
Python——关于排序算法(选择排序法)
假设首数字最小,然后依次比对,最终取得最小值的序号,也就是1的序号,然后将1与首位数字互换:
Ed_Frey
2019/07/04
6910
Python——关于排序算法(选择排序法)
漫画:什么是字符串匹配算法?
在上图中,字符串B是A的子串,B第一次在A中出现的位置下标是2(字符串的首位下标是0),所以返回 2。
小灰
2020/04/22
6140
C语言总结_数组知识点练习
C语言数组的练习题:涉及到数组插入、数组删除、数组下标数据的左移右移、数组排序、数组排序优化、数组的数据拼接等等。
DS小龙哥
2022/05/17
3160
Python+Hadoop 从DBLP数据库中挖掘经常一起写作的合作者
任务描述: 本文的写作目的是从DBLP数据库中找到经常一起写作的合作者。熟悉数据挖掘中频繁项挖掘的经典算法(FP-Growth)并作出改进和优化。实验代码用Python写的,分别在本地(Win8)和Hadoop集群(条件有限,虚拟机上跑的,3个节点)上实现。(下载本文所涉及全部代码https://github.com/findmyway/DBLP-Coauthor) 任务分解: 从DBLP数据集中提取作者信息 建立索引作者ID并对文件编码 分析数据的规模 构建FP-Tree并从FP-Tree得到频繁
机器学习AI算法工程
2018/03/13
1.8K0
Python+Hadoop   从DBLP数据库中挖掘经常一起写作的合作者
Java 编程问题:一、字符串、数字和数学
本章包括 39 个涉及字符串、数字和数学运算的问题。我们将从研究字符串的一系列经典问题开始,例如计算重复项、反转字符串和删除空格。然后,我们将研究专门用于数字和数学运算的问题,例如两个大数求和和和运算溢出,比较两个无符号数,以及计算除法和模的下限。每个问题都要经过几个解决方案,包括 Java8 的函数风格。此外,我们将讨论与 JDK9、10、11 和 12 有关的问题。
ApacheCN_飞龙
2022/07/11
8440
「JAVA」Java基础之冒泡排序、选择排序分析,简单、直观、明了
冒泡排序(Bubble Sort),排序思路:对要排序的数组或者列表从头到尾依次比较相邻的两个元素的大小关系,若大于则交换位置,否则跳过,经过第一轮比较排序后可得出最大值;
老夫编程说
2020/04/25
3000
「JAVA」Java基础之冒泡排序、选择排序分析,简单、直观、明了
c#字符串操作方法实例
# 字符串是使用 string 关键字声明的一个字符数组。字符串是使用引号声明的,如下例所示: string s = "Hello, World!"; 字符串对象是“不可变的”,即它们一旦创建就无法更改。对字符串进行操作的方法实际上返回的是新的字符串对象。因此,出于性能方面的原因,大量的连接或其他涉及字符串的操作应当用 StringBuilder 类执行,如下所示: System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.App
欢醉
2018/01/22
1.8K0
推荐阅读
相关推荐
上升下降字符串
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验