日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

401 binary watch

發(fā)布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 401 binary watch 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

 文章題目來源于leetcode,解法學(xué)習(xí)了討論去的解法。
 問題:有一種二進制LED表。上面的4個LED燈表示小時,下面6個LED燈表示分鐘。給定一個int值,寫出可能表示的時間。例如輸入1,
Input: n = 1
Return: [“1:00”, “2:00”, “4:00”, “8:00”, “0:01”, “0:02”, “0:04”, “0:08”, “0:16”, “0:32”]
 注意:1輸出結(jié)果的順序無所謂;2 小時不能有高位0,例如”01:00”是錯誤的,”1:00”是正確的;3 分鐘用兩位數(shù)表示,例如”1:1”是錯誤的,”1:01”是正確的。
 
 思路:這是一道典型的深度優(yōu)先搜索,枚舉各種情況就好了。枚舉所有小時的可能性,再枚舉所有分鐘的可能性。我確定我會做,但是失敗了。因為我同時在枚舉小時和分鐘。以前處理的都是單個的枚舉。
 

// 每一步消耗一個數(shù),同時枚舉小時和分鐘,結(jié)果錯誤,有重復(fù)的情況。private void visit(int num, int countHour, int countMinute, int startHourIndex, int startMinuteIndex) {if (num == 0) {if (countHour < 12) {String str = countHour + ":" + (countMinute < 10 ? "0" + countMinute : countMinute);if (!list.contains(str)) {list.add(str);}}} else {if (startMinuteIndex < mininutes.length) {visit(num - 1, countHour, countMinute + mininutes[startMinuteIndex], startHourIndex, startMinuteIndex + 1);visit(num, countHour, countMinute, startHourIndex, startMinuteIndex + 1);}if (startHourIndex < hours.length) {visit(num - 1, countHour + hours[startHourIndex], countMinute, startHourIndex + 1, startMinuteIndex);visit(num, countHour, countMinute, startHourIndex + 1, startMinuteIndex);}}}

收獲:
1 看了別人的解決方案后,分別枚舉小時、分鐘,最后再組合到一起。
2 還有一種方法更牛。提前把所有小時的可能組合、所有分鐘可能的組合列出來。然后再把小時、分鐘組合。參考鏈接。

private int[] hours = new int[] { 1, 2, 4, 8 };private int[] mininutes = new int[] { 1, 2, 4, 8, 16, 32 };private List<String> list;public List<String> readBinaryWatch(int num) {list = new ArrayList<String>();for (int i = 0; i <= num; i++) {List<Integer> hours = visitHour(i);List<Integer> minutes = visitMinute(num - i);for (Integer h : hours) {if (h < 12) {for (Integer m : minutes) {if (m < 60) {list.add(h + ":" + (m < 10 ? "0" + m : m));}}}}}return list;}private List<Integer> visitMinute(int num) {List<Integer> list = new ArrayList<Integer>();visit2(num,0,0,list,mininutes);return list;}private List<Integer> visitHour(int num) {List<Integer> list = new ArrayList<Integer>();visit2(num,0,0,list,hours);return list;}private void visit(int num,int count, int startIndex, List<Integer> list,int[] nums) {if(num<=0){list.add(count);return;}if(startIndex>=nums.length){return;}visit(num-1,count+nums[startIndex],startIndex+1,list,nums);visit(num,count,startIndex+1,list,nums);}/*** visit的另外一種寫法* @param num* @param count* @param startIndex* @param list* @param nums*/private void visit2(int num,int count, int startIndex, List<Integer> list,int[] nums) {if(num<=0){list.add(count);return;}for(int i=startIndex;i<nums.length;i++){visit2(num-1,count+nums[i],i+1,list,nums);}}

參考資料:
1 [題目](https://leetcode.com/problems/binary-watch/#/description)
2 討論1
3 討論2

總結(jié)

以上是生活随笔為你收集整理的401 binary watch的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。