题目

二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。

  • 例如,下面的二进制手表读取 "3:25"

img

(图源:WikiMedia - Binary clock samui moon.jpg ,许可协议:Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)

给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。

小时不会以零开头:

  • 例如,"01:00" 是无效的时间,正确的写法应该是 "1:00"

分钟必须由两位数组成,可能会以零开头:

  • 例如,"10:2" 是无效的时间,正确的写法应该是 "10:02"

示例 1:

输入:turnedOn = 1
输出:["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]

示例 2:

输入:turnedOn = 9
输出:[]

提示:

  • 0 <= turnedOn <= 10

解答

  • 基础的解法:

思路:

  1. 创建一个函数 countBits,用于计算一个整数中二进制表示中 1 的个数。该函数可以使用位运算的技巧来进行计算,例如通过不断将数字右移并与 1 进行按位与操作来判断最低位是否为 1。
  2. readBinaryWatch 函数内部,创建一个空的结果数组 result
  3. 使用两个嵌套的循环,外层循环遍历小时的取值范围从 0 到 11,内层循环遍历分钟的取值范围从 0 到 59。
  4. 对于每个小时和分钟的组合,计算二进制表示中 1 的个数。如果小时的二进制表示中 1 的个数加上分钟的二进制表示中 1 的个数等于给定的 turnedOn,则该组合满足要求。
  5. 如果满足要求,将小时和分钟格式化为时间字符串,并将其添加到结果数组 result 中。
  6. 循环结束后,返回结果数组 result

C++代码实现如下:

class Solution {
public:
    vector<string> readBinaryWatch(int turnedOn) {
        vector<string> result;
        for (int hour = 0; hour < 12; hour++) {
            int hourCount = countBits(hour);
            for (int min = 0; min <= 59; min++) {
                int minCount = countBits(min);
                if (hourCount + minCount == turnedOn) { 
                    // 如果时间符合要求
                    result.push_back(makeTime(hour, min));
                }
            }
        }
        return result;

    }
    int countBits(int num) { 
        // 计算一个整数中二进制表示中 1 的个数
        int count = 0;
        while (num != 0) {
            count += num & 1;
            num >>= 1;
        }
        return count;
    }
    string makeTime(int hour, int min) {
        // 用于将符合条件的时间组装成符合要求的字符串并返回
        string answer  = to_string(hour) + ":" + (min < 10 ? "0" : "") + to_string(min);
        return answer;
    }
};