LeetCode 解答 #38. Count and Say プログラミング練習
問題:
難易度: easy
入力: int
目的: 入力された整数をある法則に従って出力せよ
出力: String
法則:
例文にあるように、法則は以下の通りです:
まず読み方:
1: one one
2: one two
11: two one
111: three one
1121: two one one two one one
次に関数の入力と出力
入力: 1 出力: 1
入力: 2 出力: 11
入力: 3 出力: 21
入力: 4 出力: 1211
おわかりでしょうか?
まず1の入力の場合、出力は1です。
入力が2の場合、出力は前の出力の読み方です。
つまり前の出力: 入力1で出力1なので、
1を法則に従って読み、1が一つなので出力は11です。
続いて入力が3.
これも出力は前の出力、11の読み方なので、
二つの1。つまり21になります。
少しややこしいですが、英語では数が先に来るのでtwo oneと言う形式になり、21が答えです。
つまり出力は前の出力の読み方です。
注意すべき事:
- 出力はStringなので変換しておきましょう
ややこしい法則ですがちゃんと理解すれば難しくはありません。
以下回答です。
class Solution { public String countAndSay(int n) { String result = "1"; for (int i=0; i<n-1; i++) { String temp = ""; for (int m=0; m<result.length(); m++) { int num=(int)result.charAt(m)-48; int j = 1; while (j+m<result.length() && result.charAt(m+j) == result.charAt(m)) { j++; } m += j-1; temp += Integer.toString(j); temp += Integer.toString(num); } result = temp; System.out.println(result); } return result; } }
法則通り、一つずつ出力を出していき、
一つずつ数えて行くスタイルです。
resultは前の入力、
tempは今の出力になります。
次の入力に入るとtempがresultになるわけです。
注意するところは、charからintに変換する時、
そのまま変換してしまうのではなく、その数字からcharacterの'0'を引く、
つまり48を引かなくては正しく変換されません。
ASCIIの番号が変換されるからです。
今日は以上。
よいプログラミング生活を!