• Leetcode 401.二进制手表


    二进制手表

    二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)

    每个 LED 代表一个 0 或 1,最低位在右侧。

    给定一个非负整数 代表当前 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 }
  • 相关阅读:
    tp5 自定义配置文件
    php 连接redis
    Redis Desktop manager连接redis
    支付宝面对面扫码支付教程
    java.lang.IllegalAccessError: org.apache.commons.dbcp.DelegatingPreparedStatement.isClosed()
    Windows环境下用Myeclipse创建Maven项目Jsp页面报错的问题
    maven项目中配置自定义welcome-file
    Bootstrap实现图片轮播
    Java中的final 修饰参数问题
    Java迭代器Iterator理解
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10236745.html
Copyright © 2020-2023  润新知