小时候的偶像,现在还是

难度:简单

题目:

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

  1. 从 s 中选出 最小 的字符,将它 接在 结果字符串的后面。

  2. 从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。

  3. 重复步骤 2 ,直到你没法从 s 中选择字符。

  4. 从 s 中选出 最大 的字符,将它 接在 结果字符串的后面。

  5. 从 s 剩余字符中选出 最大 的字符,且该字符比上一个添加的字符小,将它 接在 结果字符串后面。

  6. 重复步骤 5 ,直到你没法从 s 中选择字符。

  7. 重复步骤 1 到 6 ,直到 s 中所有字符都已经被选过。

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

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

思考:

老规矩,第一件事是最重要就是看到长题目不要慌,耐心看完,读懂题意。

然后想一下,发现就是字符排序,先正序再逆序,然后重复。

所以说,看着长的未必中用。

看懂后还不是一笑而过,

像他一样

思路:

首先可以把字符串转成char数组后用Arrays.sort排序,一气呵成。

然后任何乱序的string都可以得到像上面例子1那种aaabbbccc的形式

 ③然后就分别从头和尾遍历取字符append就可以了。

题目那么长,也就那么回事。

伪代码:

/** * 排序方式 * @param s * @return */public static String sortString2(String s) {    char[] chars = s.toCharArray();    // 排序chars    Arrays.sort(chars);    // 下标数组,记录个数    StringBuilder sb = new StringBuilder();    // 来回循环填充    int count;    do {        count = 0;  // 标记        // 正序        for (int i=0; i            // if啥啥啥             // append(chars[i]        }        // 逆序        for (int i=chars.length-1; i>=0; i--) {            // if啥啥啥             // append(chars[i]        }    } while (count > 0);    return sb.toString();}

    时间复杂度:最坏O(n²) 最好O(n)

    空间复杂度:O(n)

再想想

又思考:

这种思路虽然好像可以,

但是,昨天我也写过Arrays.sort的排序,是多种排序混在一起的。最坏情况是O(n²),还要再加上后面的重新排序字符的O(n)。

而且还要判断多个重复字符的情况,例如aaabbbccc,先取了a就要判断后一个字符比a大,如果都取完了只剩下a的话,就是跟前一个字符相同大小,就还要判断是否只剩下最后一种字符。

这也太那个了吧;

能不能换种思路,

因为字符都是a-z,a-z肯定小到大,先记录下所有字符个数?用数组?

没错,就是用数组,

又思路:

以阿斯克码作为下标,然后遇到字符就在对应的下标+1,例如aaabbbccc就是int[......(97)3,(98)3,(99)3,(100)0.....](abc的阿斯克码分别是97,98,99),这样空间复杂度对多也就是O(1),如果只用a-z(每个字符-97)还能再省点,只用到26个下标空间。中华民族优良传统。

这样就得到26个字符对应下标的数量,然后先顺序拿一个,再逆序拿一个,知道所有都拿完就O98K了,

这样也不用排序费时,也不用费空间,还不用判断大小,因为在数组相当于规定大小顺序了。

    perfect!

真代码:

public String sortString(String s) {    int[] ints = new int[26];    // 下标数组,记录个数    for (int i=0; i        ints[s.charAt(i)-97]++;    }    StringBuilder sb = new StringBuilder();    // 来回循环填充    int count, type = 1;    do {        count = 0;        if (type == 1) {            for (int i=0; i                if (ints[i] > 0) {                    sb.append((char)(i+97));                    count++;                    ints[i]--;                }            }            type = -type;        } else {            for (int i=ints.length-1; i>=0; i--) {                if (ints[i] > 0) {                    sb.append((char)(i+97));                    count++;                    ints[i]--;                }            }            type = -type;        }    } while (count > 0);    return s}

    时间复杂度:O(n)

    空间复杂度:O(1)

--------------------------------------完------------------------------

感冒会唔会si人啊

我读的书少

oracle将字符串转成数组_【算法打卡】上升下降字符串相关推荐

  1. c字符串分割成数组_数组与字符串

    定义数组时,应该注意以下几点: (1) 数组使用的是方括号[ ],不要误写成小括号( ). (2) 常量表达式的值必须是一个正整数值,不能含有变量,但是可以是符号常数或常量表达式. (3) 数组定义后 ...

  2. java字符串拆分成数组_用Java实现JVM第八章《数组和字符串》

    小傅哥 | https://bugstack.cn 沉淀.分享.成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获.目前已完成的专题有:Netty4.x实战专题案例.用J ...

  3. oracle 分割字符成数组,oracle依据分隔符将字符串分割成数组函数

    oracle根据分隔符将字符串分割成数组函数 --创建表类型 create or replace type mytype as table of number; --如果定义成varchar --CR ...

  4. oracle 字符串分割成数组_oracle根据分隔符将字符串分割成数组函数

    --创建表类型 create or replace type mytype as table of number; --如果定义成varchar --CREATE OR REPLACE type my ...

  5. php 将一个字符串转换成数组,PHP将一个字符串转换成数组

    PHP将一个字符串转换成数组,支持中文/** * 将一个字符串转换成数组,支持中文 * @param string $string 待转换成数组的字符串 * @return string 转换后的数组 ...

  6. 将数组格式的字符串转换成数组

    转自:https://www.cnblogs.com/shy0113/p/12064590.html 由于数据传输的原因,有时我们得到的是字符串形式的数组(比如:str='["a" ...

  7. asp.net(c#)如何把字符串转换成数组

    数据库中记录保存格式是"a,b,c,d",现准备分别取出各值,如果直接取出做数组是不行的,必须进行转换,本文分2种情况,一种是该字符串转换成字符string[]类数组,一种是字符串 ...

  8. PHP中怎么把字符串分割成数组?

    经常会遇到要把字符串分割成数组的情况,在Java中只要调用split(",")方法就能把字符串分割成数组,在JS中也很简单同样也是调用split( "," )方 ...

  9. php把字符串变为数组_php怎么把字符串转换成数组?

    php怎么把字符串转换成数组?下面本篇文章给大家介绍一下PHP把字符串转换成数组的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. PHP中,将一个字符串转成数组,是使用非常频繁 ...

最新文章

  1. 各种 Optimizer 梯度下降优化算法回顾和总结
  2. C# where用法
  3. 发布开源库的踩坑经历:jitpack.io
  4. [基础题] 7.第二种(*)按如下要求编写Java程序:
  5. HTML5 main元素
  6. 3 二分频verilog与Systemverilog编码
  7. Android斗地主源码实现
  8. 帝国CMS仿《游戏资讯网》优化版整站源码/专业游戏资讯网站系统模版
  9. android 遥控器方向,最简单DIY基于Android系统的万能蓝牙设备智能遥控器
  10. 2022-2027年中国医疗行业市场深度分析及投资战略规划报告
  11. C语言中access/_access函数的使用
  12. 【C语言经典100题】乒乓球队的比赛
  13. 互联网医院源码|互联网医院软件体现智慧医疗的优势
  14. 荧光定量PCR:基因相对表达量计算方法
  15. 数学公式识别神器Mathpix,零错误高效率
  16. matlab 模拟 峰信号
  17. Barrier与多线程
  18. 设计师必备的在线配色网
  19. 摘:一张废手机卡的作用
  20. x86服务器(HP/DELL/IBM)测试分析(下)

热门文章

  1. 物理频率、模拟角频率、数字角频率和归一化数字角频率个人理解
  2. Undefined control sequence.l.463 \cita
  3. LDA主题模型原理解析与python实现
  4. 用windows通过xrdp远程连接到ubuntu16后 Tab键无法使用
  5. Linux 基本命令(六)--pwd 常用命令
  6. TCP的电话系统比喻
  7. 无限滑动的banner图,中间显示大图两边显示一部分,无限滚动
  8. 青云QingCloud打造云端ICT服务 实现战略全面升级
  9. Linux下iptables 禁止端口和开放端口
  10. CS224d lecture 9札记