题解 | #字符串排序#

字符串排序

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))
}

全部评论

相关推荐

迷茫的大四🐶:28?别太离谱,研究生出来也得25至少了
牛客吐槽大会
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务