Leetcode Note: Go - Excel Sheet Column Number

Excel Sheet Column Number - LeetCode
https://leetcode.com/problems/excel-sheet-column-number/

  • Go 言語で取り組んだメモ

所感

  • 前にやったエクセル問題の逆版
  • 文字列を数値に変換する

回答

very simple 5 line solution - LeetCode Discuss
https://leetcode.com/problems/excel-sheet-column-number/discuss/654014/very-simple-5-line-solution

func titleToNumber(columnTitle string) int {
    num := 0
    for _, c := range columnTitle {
        num *= 26
        num += int(c - 'A') + 1
    }
    return num
}
  • 1桁の文字ごとに判定する
    • アルファベットは全26種類なので桁ごとに x26 してカウント
    • 対象の文字を算出
      • x26 している分を考慮して - 'A'
      • 0 からカウントになるため +1

rune 型を int にキャストした際の数値について

  • - 'A' とかで計算できるのは何?と思って調べたメモ
  • 結論としては Go 言語における rune 型を int にキャストした場合、その文字を Unicode 番号を 10 進数化した数値となる
  • A という文字列は Unicode 的に U+0041 であり番号は 0041 となり、 Unicode は 16進数 で表現される値なので、これを 10進数 に変換すると 65 となる

    • この 10進数化 した値を HTML-code と表現したりもする
    • https://unicode-table.com/en/0041/

      package main
      
      import "fmt"
      
      func main() {
      	myrune := 'A'
      	fmt.Println(int(myrune)) // 65
      	fmt.Printf("Unicode %U", myrune) // U+0041
      }

もちろん日本語のようなマルチバイト文字でも同様

  • https://unicode-table.com/en/3042/
  • ちなみに String としては複数の Byte データとして扱われるので注意

    • これは恐らく、基本的に UTF-8 としてデフォルトエンコーディングが扱われているためだろう
    • なので文字列の各文字に対して処理を行いたい場合には、スライスによるアクセスではなく for, range を用いて rune を対象としたアクセスを行うとシンプルで良さそう

      package main
      
      import "fmt"
      
      func main() {
      	myrune := 'あ'
      	fmt.Println(int(myrune)) // 12354
      	fmt.Printf("Unicode %U", myrune) // U+3042
      
      	mystring := "あ"
      	for i := 0; i < len(mystring); i++ {
      		b := mystring[i] // byte
      		fmt.Printf("%x\n", b) // e3, 81, 82
      	}
      }