“365算法每日學計劃”:01打卡

image

自己一直在思考,怎麼把算法的訓練做好,因爲個人在算法這方面的掌握確實還不夠。因此,我現在想做一個“365算法每日學計劃”。

“計劃”的主要目的:

1、想通過這樣的方式監督自己更努力的學習算法。

2、想和小夥伴們“組團”一起來學習交流學習算法過程中的點點滴滴。

“計劃”的主要內容:

1、數據結構和算法的基礎知識鞏固。

2、逐步進階的oj算法訓練。

“計劃”的時間安排:每週三和週六

——說在前面

“算法每日學”計劃01打卡:
問題描述
對於長度爲5位的一個01串,每一位都可能是0或1,一共有32種可能。它們的前幾個是:

00000

00001

00010

00011

00100

請按從小到大的順序輸出這32種01串。

輸入格式

本試題沒有輸入。

輸出格式

輸出32行,按從小到大的順序每行一個長度爲5的01串。

樣例輸出

00000

00001

00010

00011

<以下部分省略>

解題思路與實現

如果有小夥伴很少接觸到這種題目的話,可能會覺得有點陌生,不知道從何下手,可能一開始我們能想到“最笨”的方法,但是也覺得挺有“娛樂性”的方法。

System.out.println("00000")
..........
System.out.println("11111")

這種方式是不是也能夠得到最後的結果,沒錯,當然沒問題,但是,我們在思考的時候可以一步一步來,嘗試多種方法,找到最優解。

這種方法看來不太好,一是不夠靈活,二是敲代碼很累,所以,改進一下。

image

這種方式是不是能夠更加靈活的解決這個問題,這個解決的方式就是我們常說的“暴力破解”,全部用for循環來遍歷所有的情況,如果找到符合的情況就輸出,但是我們會發現,這個算法的時間複雜度是:O(n^5),這個方法比前一種方法更好了,但是還不是最好的答案。

public static void main(String[] args) {
        for (int i = 0; i < 32; i++) {
            String result = Integer.toBinaryString(i);
            int num = result.length();
                for (int j = 0; j < 5 - num; j++) {
                    result = "0" + result;
                }
                System.out.println(result);

    }

}

再來看看這種方法,這種方法的思路:通過jdk的方法Integer.toBinaryString()獲取到每個數字的二進制,因爲要求輸出的是形如“11111”的五位數字,所以,我們還需要根據得到的二進制的數字的長度,在這個字符串的前面加上5 - num“0”,比如,得到的二進制是1(長度爲1),所以在1的前面要加上5-(num=1)等於4個0

是不是特別的簡潔,而且這種方法的效率應該也是不錯的:O(n),因爲這個是jdk提供的方法,在底層是用位移的方法來實現的(注:我們不推薦用jdk的方法來解決,我們儘量用自己思考的方法來解決,就算這個方法“笨”,但是也是自己思考了)。

當然,如果我們換個角度,也可以的到另一種解法。

 public static void main(String args[]){ 
        for(int i=0;i<32;i++){ 
            String str = Integer.toBinaryString(i); 
            switch (str.length()) { 
            case 1: 
                str = "0000"+str; 
                break; 
            case 2: 
                str = "000"+str;
                break;
            case 3:
                str = "00"+str;
                break;
            case 4:
                str = "0"+str;
                break;
            }
                System.out.println(str);

        }
    }
}

這種解法只是用switch-case的方式來解決而已,思路和上面一樣。

最後再來一種不用jdk的方法來解決:

這種方法的思路先不提供,留給小夥伴們自己思考,如果小夥伴有自己的想法,歡迎小夥伴們在留言區給出你的想法或者解法。

另外,還創建了一個“算法每日學交流社區”,如果有想加入的小夥伴,可以掃一下下面的二維碼加我爲好友,我拉你入羣(注:以上的有幾種算法來自“算法每日學交流社區”的小夥伴們)。

image

文章有不當之處,歡迎指正,你也可以關注我的微信公衆號:好好學java,獲取優質學習資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章