“365算法每日學計劃”:01打卡
自己一直在思考,怎麽把算法的訓練做好,因為個人在算法這方面的掌握確實還不夠。因此,我現在想做一個“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")
這種方式是不是也能夠得到最後的結果,沒錯,當然沒問題,但是,我們在思考的時候可以一步一步來,嘗試多種方法,找到最優解。
這種方法看來不太好,一是不夠靈活,二是敲代碼很累,所以,改進一下。
這種方式是不是能夠更加靈活的解決這個問題,這個解決的方式就是我們常說的“暴力破解”,全部用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的方法來解決:
這種方法的思路先不提供,留給小夥伴們自己思考,如果小夥伴有自己的想法,歡迎小夥伴們在留言區給出你的想法或者解法。
另外,還創建了一個“算法每日學交流社區”,如果有想加入的小夥伴,可以掃一下下面的二維碼加我為好友,我拉你入群(註:以上的有幾種算法來自“算法每日學交流社區”的小夥伴們)。
文章有不當之處,歡迎指正,你也可以關註我的微信公眾號:
好好學java
,獲取優質學習資源。
“365算法每日學計劃”:01打卡