LeetCode 解答 #38. Count and Say プログラミング練習

問題:
f:id:stlisacity:20180610113715p:plain
難易度: 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の番号が変換されるからです。

今日は以上。
よいプログラミング生活を!