Leetcode 401.二进制手表
二进制手表
二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)。
每个 LED 代表一个 0 或 1,最低位在右侧。
给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。
案例:
输入: n = 1
返回: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
注意事项:
- 输出的顺序没有要求。
- 小时不会以零开头,比如 "01:00" 是不允许的,应为 "1:00"。
- 分钟必须由两位数组成,可能会以零开头,比如 "10:2" 是无效的,应为 "10:02"。
1 import java.util.ArrayList; 2 import java.util.List; 3 4 class Solution { 5 public static List<String> readBinaryWatch(int num) { 6 List<String> times = new ArrayList<String>(); //时间集合 7 int[] watch = new int[10]; //数组表示灯的位置,下标为 0到3 表示 小时的最高位到最低位 8 //下标为4到9表示分钟的最高位到最低位。 9 //例如:watch[0]的权是8,watch[3]的权是1,watch[4]的权是32,watch[9]的权是1 10 Trial(num, 0, watch, times); 11 return times; 12 } 13 //n代表亮灯的数量,a代表现在可亮灯位置的第一位(最后一位是 9) 14 //这个代表的含义是:在位置(以数组下标表示)a到9 可以点亮n盏灯, 15 //第一次调用时a=0,代表的意思是在数组下标 0到9 可以点亮n盏灯 16 public static void Trial(int n,int a,int[] watch,List<String> times){ 17 if(n==0) { 18 String time = ""; 19 int hour = SumOfIntArray(3, 0, watch); 20 time = time + hour + ":"; 21 int minute = SumOfIntArray(9, 4, watch); 22 if(minute<10) time = time+0+minute; 23 else time = time + minute; 24 times.add(time); 25 return; //递归返回,这句话关键代码,一定不要忘了!!! 26 //但是本程序这行不加不影响,大不了不返回上一层,接着执行, 27 //n减小成负数,a不停增加,直到大于9,再逐步返回。 28 } 29 for(;a<=9;a++){ 30 watch[a] = 1;//在a位置点亮一盏灯 31 //当不是下面这些情况时,递归循环,如果是的话,不进入循环,直接回溯 32 if( ! ((watch[0] == 1 && watch[1] == 1) || 33 (watch[4] == 1 && watch[5] == 1 && watch[6] == 1 && watch[7] == 1))){ 34 //进入递归循环,子问题的意思是:在位置(以数组下标表示)a+1到9 可以点亮n-1盏灯 35 Trial(n-1, a+1, watch, times); 36 } 37 watch[a]=0; //回溯 38 } 39 return; 40 } 41 public static int SumOfIntArray(int a,int b,int[] times){ 42 //a是低位,b是高位,a是3或9,b是0或4 43 int sum = 0; 44 int mi = 0; 45 for(int i=a;i>=b;i--){ 46 sum = (int) (sum +times[i]*Math.pow(2, mi)); 47 mi++; 48 } 49 return sum; 50 } 51 }