「365算法每日學計劃」:01打卡

image

本身一直在思考,怎麼把算法的訓練作好,由於我的在算法這方面的掌握確實還不夠。所以,我如今想作一個「365算法每日學計劃」。

「計劃」的主要目的:java

一、想經過這樣的方式監督本身更努力的學習算法。算法

二、想和小夥伴們「組團」一塊兒來學習交流學習算法過程當中的點點滴滴。微信

「計劃」的主要內容:數據結構

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

二、逐步進階的oj算法訓練。學習

「計劃」的時間安排:每週三和週六spa

——說在前面code

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

00000rem

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,獲取優質學習資源。
相關文章
相關標籤/搜索