ソードフィンガーオファーインタビュー質問46:配列を最小数に配置します(再帰的なサブ問題を下から上に解決します)

この質問について、私の最初のアイデアは再帰でしたが、順列と組み合わせに関しては、良い方法を考えることができないと感じています。答えの公式を持った後でも、直接配置して組み合わせて結果を得るのは簡単ではありません。

答えを読んだ後、答えは式を与えます

f(i)= f(i + 1)+ g(i、i + 1)* f(i + 2)、ここでf(i)は数値iで始まる型の数を表し、gはiの場合を表します。 i + 1は26未満の数に組み合わせることができ、それから1になり、それ以外の場合は0になります。このような再帰はすべてのケースを計算できますが、サブ問題が繰り返されます。したがって、右から左に翻訳し、さまざまな翻訳の数を数えて、問題を下から上に解決します。

 

下から上に移動するときは、最初に最後の計算を計算します。これは、前の計算が後の要素の計算結果に依存するため、結果を保存する配列を下から上に実現できるためです。

 

 

回答コード

    public int translateNum(int num) {
        String num_s = num + "";
        char[] num_c = num_s.toCharArray();
        int[] time_num = new int[num_c.length];
        for(int count = num_c.length -1;count>=0;count--){
            if(count == num_c.length -1){
                time_num[count] = 1;

            }else{
                time_num[count] = time_num[count+1];
            }
            if(count + 1 <num_c.length){
                int dig1 = num_c[count] - '0';
                int dig2 = num_c[count+1] - '0';

                if(dig1*10 + dig2 <=25 && dig1*10 + dig2 >= 10){
                    if(count < num_c.length - 2){
                        time_num[count] += time_num[count + 2];
                    }else{
                        time_num[count] += 1;
                    }
                    
                }
            }


        }
        return time_num[0];
    }

 

おすすめ

転載: blog.csdn.net/qq_40473204/article/details/114576706