自定义排序:求解《937. 重新排列日志文件》

2022-05-03 17:54:28
自定义排序和 Golang 的字符串分割函数,求解《937. 重新排列日志文件》


自定义排序函数

Golang 的字符串分割函数

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

例题

937. 重新排列日志文件

给你一个日志数组 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;
  }
}

双指针,字符串截取、拼接:求解《面试题 01.05. 一次编辑》
双指针,字符串截取、拼接,2 解法求解《面试题 01.05. 一次编辑》
双指针:求解《942. 增减字符串匹配》
双指针,求解《942. 增减字符串匹配》
消元法,正则和栈:求解《591. 标签验证器》
消元法,正则和栈,求解《591. 标签验证器》