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
- x26 している分を考慮して
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 } }