sort
a
后 b
前, - 1
交换sort.SliceStable
a
后 b
前,true
交换usort
a
前 b
后,true
交换package main
import (
"fmt"
"strings"
"unicode"
)
func main() {
/* Fields */
// 按空格或连续空格分隔
slice := strings.Fields(" foo bar baz ")
fmt.Println(slice)
/* FieldsFunc */
// 回调函数分隔字符串
slice = strings.FieldsFunc(" foo bar baz", func(char rune) bool {
return unicode.IsSpace(char)
})
fmt.Println(slice)
/* Split */
// 按 sep 分割
slice = strings.Split("foo,bar,baz", ",")
fmt.Println(slice)
/* Split */
// 按 sep 分割,保留 sep
slice = strings.SplitAfter("foo,bar,baz", ",")
fmt.Println(slice)
/* SplitN */
// 按 sep 分割 N 次
slice = strings.SplitN("foo,bar,bza", ",", 2)
fmt.Println(slice)
/* SplitN */
// 按 sep 分割 N 次,保留 sep
slice = strings.SplitAfterN("foo,bar,bza", ",", 2)
fmt.Println(slice)
}
给你一个日志数组 logs。每条日志都是以空格分隔的字串,其第一个字为字母与数字混合的 标识符 。
有两种不同类型的日志:
字母日志:除标识符之外,所有字均由小写字母组成
数字日志:除标识符之外,所有字均由数字组成
请按下述规则将日志重新排序:
所有 字母日志 都排在 数字日志 之前。
字母日志 在内容不同时,忽略标识符后,按内容字母顺序排序;在内容相同时,按标识符排序。
数字日志 应该保留原来的相对顺序。
返回日志的最终顺序。
var reorderLogFiles = function(logs) {
return logs.sort((a, b) => {
const [aSignal, aString] = split(a), [bSignal, bString] = split(b)
const aIsLower = isLower(aString.charCodeAt(0)), bIsLower = isLower(bString.charCodeAt(0))
if (aIsLower && bIsLower) {
if (aString === bString) return aSignal < bSignal ? -1 : 0
return aString < bString ? -1 : 0
}
if (aIsLower) return -1
return 0
})
};
const isLower = charCode => charCode >= 97 && charCode <= 122
const split = log => {
let i = 0
while (log[i] !== ' ') i++
return [log.slice(0, i), log.slice(i + 1)]
}
func reorderLogFiles(logs []string) []string {
sort.SliceStable(logs, func(a int, b int) bool {
aSlice, bSlice := strings.SplitN(logs[a], " ", 2), strings.SplitN(logs[b], " ", 2)
aSingal, aString, bSingal, bString := aSlice[0], aSlice[1], bSlice[0], bSlice[1]
aIsLower, bIsLower := unicode.IsLower(rune(aString[0])), unicode.IsLower(rune(bString[0]))
if aIsLower && bIsLower {
if aString == bString {
return bSingal > aSingal
}
return bString > aString
}
if aIsLower {
return true
}
return false
})
return logs
}
class Solution {
function reorderLogFiles($logs) {
usort($logs, function($a, $b) {
[$aSingal, $aString] = explode(' ', $a, 2);
[$bSingal, $bString] = explode(' ', $b, 2);
$aIsLower = ctype_lower($aString[0]);
$bIsLower = ctype_lower($bString[0]);
if ($aIsLower && $bIsLower) {
if ($aString === $bString) return $aSingal > $bSingal;
return $aString > $bString;
}
if ($bIsLower) return true;
return false;
});
return $logs;
}
}