oracle将字符串转成数组_【算法打卡】上升下降字符串
小时候的偶像,现在还是
难度:简单
题目:
给你一个字符串 s
,请你根据下面的算法重新构造字符串:
从
s
中选出 最小 的字符,将它 接在 结果字符串的后面。从
s
剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。重复步骤 2 ,直到你没法从
s
中选择字符。从
s
中选出 最大 的字符,将它 接在 结果字符串的后面。从
s
剩余字符中选出 最大 的字符,且该字符比上一个添加的字符小,将它 接在 结果字符串后面。重复步骤 5 ,直到你没法从
s
中选择字符。重复步骤 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将字符串转成数组_【算法打卡】上升下降字符串相关推荐
- c字符串分割成数组_数组与字符串
定义数组时,应该注意以下几点: (1) 数组使用的是方括号[ ],不要误写成小括号( ). (2) 常量表达式的值必须是一个正整数值,不能含有变量,但是可以是符号常数或常量表达式. (3) 数组定义后 ...
- java字符串拆分成数组_用Java实现JVM第八章《数组和字符串》
小傅哥 | https://bugstack.cn 沉淀.分享.成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获.目前已完成的专题有:Netty4.x实战专题案例.用J ...
- oracle 分割字符成数组,oracle依据分隔符将字符串分割成数组函数
oracle根据分隔符将字符串分割成数组函数 --创建表类型 create or replace type mytype as table of number; --如果定义成varchar --CR ...
- oracle 字符串分割成数组_oracle根据分隔符将字符串分割成数组函数
--创建表类型 create or replace type mytype as table of number; --如果定义成varchar --CREATE OR REPLACE type my ...
- php 将一个字符串转换成数组,PHP将一个字符串转换成数组
PHP将一个字符串转换成数组,支持中文/** * 将一个字符串转换成数组,支持中文 * @param string $string 待转换成数组的字符串 * @return string 转换后的数组 ...
- 将数组格式的字符串转换成数组
转自:https://www.cnblogs.com/shy0113/p/12064590.html 由于数据传输的原因,有时我们得到的是字符串形式的数组(比如:str='["a" ...
- asp.net(c#)如何把字符串转换成数组
数据库中记录保存格式是"a,b,c,d",现准备分别取出各值,如果直接取出做数组是不行的,必须进行转换,本文分2种情况,一种是该字符串转换成字符string[]类数组,一种是字符串 ...
- PHP中怎么把字符串分割成数组?
经常会遇到要把字符串分割成数组的情况,在Java中只要调用split(",")方法就能把字符串分割成数组,在JS中也很简单同样也是调用split( "," )方 ...
- php把字符串变为数组_php怎么把字符串转换成数组?
php怎么把字符串转换成数组?下面本篇文章给大家介绍一下PHP把字符串转换成数组的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. PHP中,将一个字符串转成数组,是使用非常频繁 ...
最新文章
- 各种 Optimizer 梯度下降优化算法回顾和总结
- C# where用法
- 发布开源库的踩坑经历:jitpack.io
- [基础题] 7.第二种(*)按如下要求编写Java程序:
- HTML5 main元素
- 3 二分频verilog与Systemverilog编码
- Android斗地主源码实现
- 帝国CMS仿《游戏资讯网》优化版整站源码/专业游戏资讯网站系统模版
- android 遥控器方向,最简单DIY基于Android系统的万能蓝牙设备智能遥控器
- 2022-2027年中国医疗行业市场深度分析及投资战略规划报告
- C语言中access/_access函数的使用
- 【C语言经典100题】乒乓球队的比赛
- 互联网医院源码|互联网医院软件体现智慧医疗的优势
- 荧光定量PCR:基因相对表达量计算方法
- 数学公式识别神器Mathpix,零错误高效率
- matlab 模拟 峰信号
- Barrier与多线程
- 设计师必备的在线配色网
- 摘:一张废手机卡的作用
- x86服务器(HP/DELL/IBM)测试分析(下)