题目描述
给出一个字符串 s, 根据下面提供的算法说明重新构造字符串。
算法的流程说明 :
1. 从 s 中选出 最小 的字符,将它接在结果字符串的后面。
2. 从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它接在结果字符串后面。
3. 重复步骤 2 ,直到你没法从 s 中选择字符。
4. 从 s 中选出最大的字符,将它接在结果字符串的后面。
5. 从 s 剩余字符中选出 最大 的字符,且该字符比上一个添加的字符小,将它接在结果字符串后面。
6. 重复步骤 5 ,直到你没法从 s 中选择字符。
7. 重复步骤 1 到 6 ,直到 s 中所有字符都已经被选过。
说明:在任何一步中,如果最小或者最大字符不止一个 ,你可以选择其中任意一个,并将其添加到结果字符串。
相关示例
示例1:
示例2:
示例3:
代码
package zifuchuan.demo;
//1370 上升和下降字符串
public class Sooution {
public String sortString(String s){
int[] count = new int[26];
for(char c : s.toCharArray()) //toCharArray()方法能将字符串转换成字符串数组
count[c - 'a'] += 1;
StringBuilder res = new StringBuilder();
//使用StringBuilder类实例化字符串对象是因为能对其字符串长度进行改变
while(res.length() != s.length()){
for(int i = 0; i < 26; i++){
if(count[i] == 0)
continue;
res.append((char)( i + 'a'));//append()方法实现字符串的拼接
count[i]--;
}
for(int i = 25; i >= 0; i-- ){
if(count[i] == 0)
continue;
res.append((char)( i + 'a'));
count[i]--;
}
}
return res.toString();
//System.out.println(res.toString());
}
public static void main(String[] args){
String s = new String("aaaabbbbcccc");
Sooution solo = new Sooution();
solo.sortString(s);
}
}
思路总结
1、首先这个题的算法在一个带参数的函数方法中,首先定义一个长度为26个元素的数组,利用方法toCharArray()将字符串s转换为字符数组。定义一个字符型变量,然后遍历已经转换为字符数组的 s , 这一步遍历的过程是统计字符数组中对应的小写字母有多少个。
2、使用StringBuilder类实例化一个对象,利用该类来实例化一个字符串对象主要是这个字符串对象的长度总在发生改变。利用while循环来循环之前定义的count数组,这个count数组中对应的索引表示对应的字符型字母,对应索引位置存放的是该字符型字母在字符串s中的个数,while循环的终止条件是拼接结果对象res的长度等于字符串s的长度。
3、 while循环中的两个for循环,第一个循环从索引为0的位置,也就是表示字符为 ‘a’的开始,使用方法res.append((char)( i + ‘a’))利用索引实现了对字符的拼接,然后将count中索引对应的字符 ’ a '中存放的个数进行减 1 操作,接着遍历索引为 2,也就是对应字符为 ‘b’ 的个数,执行相同的步骤,直到将这个数组遍历完。接下来执行第二个循环,先遍历count数组中索引值较大的,执行步骤相同,最后输出res的字符串结果。