• leetcode-二进制手表


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

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

    例如,上面的二进制手表读取 “3:25”。

    给定一个非负整数 代表当前 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,2,4,8,16进行组合。 与组合总数类型的题目相似:leetcode-组合总数III(回溯)

    但是数字为小时和分钟,因此通过一个k和num-k来控制小时和分钟的个数。

    具体代码如下:

    //思路: 通过1,2,4,8的组合获得h和m的可能性,与combination相似。每次组合的过程中,从小时中取出i个,从分钟取出num-i个。
    //组合的思想为回溯: 与组合类似,取出多少个数字进行组合。
    class Solution {
    public:
        void dfs(vector<int>& nums,vector<int>& temp,int count,int out,int start){
            if(count==0){
                temp.push_back(out);
                return;
            }
            for(int i=start;i<nums.size();i++){
                dfs(nums,temp,count-1,out+nums[i],i+1);
            }
        }
        vector<int> help(vector<int>& nums,int count){
            vector<int> temp;
            dfs(nums,temp,count,0,0);
            return temp;
        }
        vector<string> readBinaryWatch(int num) {
            vector<string> res;
            vector<int> hours{1,2,4,8},mins{1,2,4,8,16,32};
            for(int k=0;k<=num;k++){
                vector<int> hour=help(hours,k);
                vector<int> min=help(mins,num-k);
                for(int h:hour){
                    if(h>11)continue;
                    for(int m:min){
                        if(m>59)continue;
                        res.push_back(to_string(h)+(m>9?":":":0")+to_string(m));
                    }
                }
            }
            return res;
        }
    };
    奇淫技巧!!!
    Java  利用String 函数的format,可以将字符串特定格式化输出!!!

    bitCount

    public static int bitCount(int i)
    返回指定 int 值的二进制补码表示形式的 1 位的数量。比如bitCount(1) =1;  (2)=1 ;  (3)=2;
    class Solution {
        public List<String> readBinaryWatch(int num) {
            List<String> res=new ArrayList();
           for(int h=0;h<12;h++){
               for(int m=0;m<60;m++){
                   if(Integer.bitCount(h)+Integer.bitCount(m)==num)
                       res.add(String.format("%d:%02d",h,m));
               }
           }
            return res;
        }
    }
  • 相关阅读:
    VC 编译 MATLAB 的 mex 文件
    MATLAB 与 Excel 接口
    MATLAB 编译器的使用
    为什么安装了MinGW之后,还是不能在Matlab中使用mex?
    matlab文件操作
    matlab外部程序接口-excel
    数字图像加密-同态加密方案
    matlab数字图像简单的加密方法
    matlab中矩阵的表示与简单操作
    linux 安装eccodes环境
  • 原文地址:https://www.cnblogs.com/patatoforsyj/p/9741681.html
Copyright © 2020-2023  润新知