题解 | #字符串排序#

字符串排序

http://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584

Golang题解

注意在Less函数中处理大小写问题,以及使用sort包中Stable方法进行排序,Stable为稳定排序法,Sort为不稳定排序法,性能比Stable好

package main

import (
    "fmt"
    "bufio"
    "os"
    "sort"
)

type letterSlice []byte

func (a letterSlice) Len() int {
    return len(a)
}

func (a letterSlice) Less(i, j int) bool {
    switch {
    case a[i] >= 'a' && a[i] <= 'z' && a[j] >= 'a' && a[j] <= 'z':
        fallthrough
    case a[i] >= 'A' && a[i] <= 'Z' && a[j] >= 'A' && a[j] <= 'Z':
        return a[i] < a[j]
    case a[i] >= 'a' && a[i] <= 'z' && a[j] >= 'A' && a[j] <= 'Z':
        return a[i] < (a[j] + 'a' - 'A')
    case a[i] >= 'A' && a[i] <= 'Z' && a[j] >= 'a' && a[j] <= 'z':
        return (a[i] + 'a' - 'A') < a[j]
    default:
        return false
    }
}

func (a letterSlice) Swap(i, j int) {
    a[i], a[j] = a[j], a[i]
}

func main() {
    sc := bufio.NewScanner(os.Stdin)
    sc.Scan()
    strBytes := []byte(sc.Text())
    l := len(strBytes)
    idxMap := make([]int, 0, l)
    letters := letterSlice(make([]byte, 0, l))
    for i, strByte := range strBytes {
        if strByte >= 'a' && strByte <= 'z' || strByte >= 'A' && strByte <= 'Z' {
            idxMap = append(idxMap, i)
            letters = append(letters, strByte)
        }
    }
    sort.Stable(letters)
    for i, letter := range letters {
        strBytes[idxMap[i]] = letter
    }
    fmt.Println(string(strBytes))
}
全部评论

相关推荐

zhiyog:哈哈哈哈哈哈哈哈哈哈哈哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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