我是靠谱客的博主 聪慧蚂蚁,最近开发中收集的这篇文章主要介绍[LeetCode]401. Binary Watch(二进制手表),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

401. Binary Watch

原题地址
A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom represent the minutes (0-59).
原题图片
Each LED represents a zero or one, with the least significant bit on the right.

For example, the above binary watch reads “3:25”.

Given a non-negative integer n which represents the number of LEDs that are currently on, return all possible times the watch could represent.

Example:

Input: n = 1
Return: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]

Note:

  1. The order of output does not matter.输出顺序不影响
  2. The hour must not contain a leading zero, for example “01:00” is not valid, it should be “1:00”.
  3. The minute must be consist of two digits and may contain a leading zero, for example “10:2” is not valid, it should be “10:02”.

题目大意:

二进制手表,上面一排代表小时,下面一排代表分钟
给一个整数代表LED灯亮的个数,返回一个字符串数组,显示所有可能的时间,时间格式注意Note的2,3

我的思路:

  • 首先先明白二进制手表的含义,把1,2,4,8转化为四位的二进制就是0001, 0010, 0100,1000, 9点时亮1和8,是1001。分钟数也是同理。
  • 其次表示小时的数值只有0-11,表示分钟的数值只有0-59。先分别对小时跟分钟的数值进行预处理,按照包含而二进制中包含1的个数分开保存小时数值的字符串跟分钟数值的字符串。
  • 以小时为例,小时使用4个位表示,最少包含0个1,最多包含3个1,所以用vector《vector《string》》 hours(4)建立一个包含4个vector的vector数组,hours[0]保存着0个1的数值对应的字符串”0”,hours[1]保存着有1个1的数值对应的字符串,即”1”,”2”,”4”,”8”,hours[2]保存着”3”,”5”,”6”,”9”,”10”,hours[3]保存着”7”,”11”。 定义numOfRow()处理这种情况
  • 读入num是LED灯亮的总个数,即小时和分钟的二进制中1的总个数
  • 小时表示亮灯个数h范围是0~3,分钟表示亮灯个数m范围是0~5,同时m = num -h
  • 定义一个字符串数组times,从h=0开始,在满足m=num -h<6和h<4的情况下,将所有可能的情况拼接成字符串,加入到times中,最后返回times

代码如下:

#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
vector<string> readBinaryWatch(int num) {
vector<string> times;
if(num<0 || num>8)
return times;
vector<vector <int>> hours(4);
vector<vector <int>> minutes(6);
for(int i=0; i<12; i++){
hours[numOfRow(i)].push_back(i);
}
for(int j=0; j<60; j++){
minutes[numOfRow(j)].push_back(j);
}
for(int h=0; h<4&&h<=num; h++){
if(num-h<6){
for(int H: hours[h]){
for(int M: minutes[num-h]){
string time = M<10 ? ":0" : ":";
times.push_back(to_string(H) + time + to_string(M));
}
}
}
}
return times;
}
int numOfRow(int num){
int Count = 0;
while(num != 0){
if(num%2 == 1)
Count++;
num /= 2;
}
return Count;
}
};
int main()
{
Solution a;
int num = 0;
cin >> num;
vector<string> times = a.readBinaryWatch(num);
for(int t=0; t<times.size(); t++)
cout << times[t] << endl;
return 0;
}

思路2:

  • 看到discuss有用bitset的,专门跑去学习一下bitset用法
  • 附上链接一,链接二
  • 挺方便的,效率也比我暴力解出来的高

    代码如下:

#include <bitset>
vector<string> readBinaryWatch1(int num) {//bitset STL模板
vector<string> times;
for (int i = 0; i < 12; i++) {
bitset<4> h(i);//4位的二进制数
for (int j = 0; j < 60; j++) {
bitset<6> m(j);//6位的二进制数
if (h.count() + m.count() == num)//h.count()函数判断h中1的个数
times.push_back(to_string(i) + (j < 10? ":0": ":") + to_string(j));
}
}
return times;
}

另外,看到还有用动态规划的,附上链接,以供参考!

  1. 链接一
  2. 链接二
  3. 链接三

最后

以上就是聪慧蚂蚁为你收集整理的[LeetCode]401. Binary Watch(二进制手表)的全部内容,希望文章能够帮你解决[LeetCode]401. Binary Watch(二进制手表)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部