题解 | #字符串排序#
字符串排序
https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
package main
import (
"fmt"
"sort"
"unicode"
"bufio"
"os"
)
func main() {
//该题参考了一位朋友的写法,把思路讲一下
// 扫描输入
scan := bufio.NewScanner(os.Stdin)
scan.Scan()
input:=scan.Text()
// 创建字母用的字符切片
letters := []rune{}
// 创建其他字符使用的bool切片
others := make([]bool, len(input))
// 扫描,逻辑是,是字母则加入letters切片
// 是其他字符则在长度为len(input)的others切片上用true表明位置
for i,v:=range input{
if unicode.IsLetter(v){
letters = append(letters, v)
continue
}
others[i] = true
}
// stable排序,大概就是保证在必要排序之外其他相对位置保持不变
// 这个排序是一个不考虑大小写的字典序的升序
sort.SliceStable(letters,func(i, j int) bool{
return unicode.ToLower(letters[i])<unicode.ToLower(letters[j])
})
// 创建结果字符串
var res []rune
for i,v:=range input{
// true表示这个位置是其他字符,将该字符加入结果切片
if others[i]==true{
res = append(res, v)
}else{
//该位置是字母,像队列一样挨个加入排好序的字母
res = append(res, letters[0])
letters=letters[1:]
}
}
fmt.Println(string(res))
}