题解 | #字符串排序#
字符串排序
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))
}