本身一直在思考,怎麼把算法的訓練作好,由於我的在算法這方面的掌握確實還不夠。所以,我如今想作一個「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")
這種方式是否是也可以獲得最後的結果,沒錯,固然沒問題,可是,咱們在思考的時候能夠一步一步來,嘗試多種方法,找到最優解。
這種方法看來不太好,一是不夠靈活,二是敲代碼很累,因此,改進一下。
這種方式是否是可以更加靈活的解決這個問題,這個解決的方式就是咱們常說的「暴力破解」,所有用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
,獲取優質學習資源。