摘要:計(jì)劃的主要內(nèi)容數(shù)據(jù)結(jié)構(gòu)和算法的基礎(chǔ)知識(shí)鞏固。逐步進(jìn)階的算法訓(xùn)練。計(jì)劃的時(shí)間安排每周三和周六說在前面算法每日學(xué)計(jì)劃打卡問題描述對(duì)于長度為位的一個(gè)串,每一位都可能是或,一共有種可能。
自己一直在思考,怎么把算法的訓(xùn)練做好,因?yàn)閭€(gè)人在算法這方面的掌握確實(shí)還不夠。因此,我現(xiàn)在想做一個(gè)“365算法每日學(xué)計(jì)劃”。“計(jì)劃”的主要目的:
1、想通過這樣的方式監(jiān)督自己更努力的學(xué)習(xí)算法。
2、想和小伙伴們“組團(tuán)”一起來學(xué)習(xí)交流學(xué)習(xí)算法過程中的點(diǎn)點(diǎn)滴滴。
“計(jì)劃”的主要內(nèi)容:
1、數(shù)據(jù)結(jié)構(gòu)和算法的基礎(chǔ)知識(shí)鞏固。
2、逐步進(jìn)階的oj算法訓(xùn)練。
“計(jì)劃”的時(shí)間安排:每周三和周六
——說在前面
“算法每日學(xué)”計(jì)劃01打卡:
問題描述
對(duì)于長度為5位的一個(gè)01串,每一位都可能是0或1,一共有32種可能。它們的前幾個(gè)是:00000
00001
00010
00011
00100
請(qǐng)按從小到大的順序輸出這32種01串。
輸入格式
本試題沒有輸入。
輸出格式
輸出32行,按從小到大的順序每行一個(gè)長度為5的01串。
樣例輸出
00000
00001
00010
00011
<以下部分省略>
解題思路與實(shí)現(xiàn)
如果有小伙伴很少接觸到這種題目的話,可能會(huì)覺得有點(diǎn)陌生,不知道從何下手,可能一開始我們能想到“最笨”的方法,但是也覺得挺有“娛樂性”的方法。
System.out.println("00000") .......... System.out.println("11111")
這種方式是不是也能夠得到最后的結(jié)果,沒錯(cuò),當(dāng)然沒問題,但是,我們?cè)谒伎嫉臅r(shí)候可以一步一步來,嘗試多種方法,找到最優(yōu)解。
這種方法看來不太好,一是不夠靈活,二是敲代碼很累,所以,改進(jìn)一下。
這種方式是不是能夠更加靈活的解決這個(gè)問題,這個(gè)解決的方式就是我們常說的“暴力破解”,全部用for循環(huán)來遍歷所有的情況,如果找到符合的情況就輸出,但是我們會(huì)發(fā)現(xiàn),這個(gè)算法的時(shí)間復(fù)雜度是:O(n^5),這個(gè)方法比前一種方法更好了,但是還不是最好的答案。
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()獲取到每個(gè)數(shù)字的二進(jìn)制,因?yàn)橐筝敵龅氖切稳?b>“11111”的五位數(shù)字,所以,我們還需要根據(jù)得到的二進(jìn)制的數(shù)字的長度,在這個(gè)字符串的前面加上5 - num個(gè)“0”,比如,得到的二進(jìn)制是1(長度為1),所以在1的前面要加上5-(num=1)等于4個(gè)0。
是不是特別的簡(jiǎn)潔,而且這種方法的效率應(yīng)該也是不錯(cuò)的:O(n),因?yàn)檫@個(gè)是jdk提供的方法,在底層是用位移的方法來實(shí)現(xiàn)的(注:我們不推薦用jdk的方法來解決,我們盡量用自己思考的方法來解決,就算這個(gè)方法“笨”,但是也是自己思考了)。
當(dāng)然,如果我們換個(gè)角度,也可以的到另一種解法。
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的方法來解決:
這種方法的思路先不提供,留給小伙伴們自己思考,如果小伙伴有自己的想法,歡迎小伙伴們?cè)?strong>留言區(qū)給出你的想法或者解法。
另外,還創(chuàng)建了一個(gè)“算法每日學(xué)交流社區(qū)”,如果有想加入的小伙伴,可以掃一下下面的二維碼加我為好友,我拉你入群(注:以上的有幾種算法來自“算法每日學(xué)交流社區(qū)”的小伙伴們)。
文章有不當(dāng)之處,歡迎指正,你也可以關(guān)注我的微信公眾號(hào):好好學(xué)java,獲取優(yōu)質(zhì)學(xué)習(xí)資源。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/69632.html
摘要:貪心算法一基本概念所謂貪心算法是指,在對(duì)問題求解時(shí),總是做出在當(dāng)前看來是最好的選擇。實(shí)際上,貪心算法適用的情況很少。值得注意的是,貪心算法并不是完全不可以使用,貪心策略一旦經(jīng)過證明成立后,它就是一種高效的算法。 自從開始做公眾號(hào)開始,就一直在思考,怎么把算法的訓(xùn)練做好,因?yàn)樗己M瑢W(xué)在算法這方面的掌握確實(shí)還不夠。因此,我現(xiàn)在想做一個(gè)365算法每日學(xué)計(jì)劃。 計(jì)劃的主要目的: 1、想通過這...
摘要:僅值班時(shí)間及前后半個(gè)小時(shí)內(nèi)打卡有效。上班下班均須打卡,缺打卡則視為未值班。分析表格我的指紋考勤機(jī)可以一次導(dǎo)出最多一個(gè)月的打卡記錄。有一個(gè)問題是,這一個(gè)月可能橫跨兩個(gè)月,也可能橫跨一年。分析當(dāng)月當(dāng)年的考勤記錄同理,不過可能稍微復(fù)雜一些。 前面的話 今天公司突然有個(gè)緊急任務(wù)是讀取excel表格,然后清洗并展示里面的數(shù)據(jù)。 分配給我的任務(wù)是?。?! 寫網(wǎng)頁前端表單=。= 媽蛋,可是我很想...
摘要:三結(jié)對(duì)編程排位賽四個(gè)人為一組,由隊(duì)長帶隊(duì)刷題,每周根據(jù)這周四個(gè)人的刷題總數(shù)進(jìn)行隊(duì)伍間排名。萬人千題結(jié)對(duì)編程排位賽如果想?yún)⒓拥牡诙诘耐瑢W(xué),可以先聯(lián)系作者加群,看看第一期的同袍是如何奮斗的。 ...
閱讀 3242·2021-10-27 14:20
閱讀 2525·2021-10-08 10:05
閱讀 1625·2021-09-09 09:33
閱讀 2902·2019-08-30 13:16
閱讀 1435·2019-08-29 18:34
閱讀 1170·2019-08-29 10:58
閱讀 1228·2019-08-28 18:22
閱讀 1226·2019-08-26 13:33