Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 1620a44

Browse files
add LeetCode 401. 二进制手表
1 parent bce9020 commit 1620a44

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2Nob2NvbGF0ZTE5OTkvY2RuL2ltZy8yMDIwMDgyODE0NTUyMS5qcGc?x-oss-process=image/format,png)
2+
>仰望星空的人,不应该被嘲笑
3+
4+
## 题目描述
5+
6+
二进制手表顶部有 4 个 LED 代表 **小时(0-11)**,底部的 6 个 LED 代表 **分钟(0-59)**
7+
8+
每个 LED 代表一个 0 或 1,最低位在右侧。
9+
10+
![](https://img-blog.csdnimg.cn/20200915161300632.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70#pic_center)
11+
12+
13+
例如,上面的二进制手表读取 "3:25"。
14+
15+
给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。
16+
17+
18+
19+
示例:
20+
21+
```javascript
22+
输入: n = 1
23+
返回: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
24+
25+
```
26+
27+
提示:
28+
29+
```javascript
30+
输出的顺序没有要求。
31+
小时不会以零开头,比如 "01:00" 是不允许的,应为 "1:00"。
32+
分钟必须由两位数组成,可能会以零开头,比如 "10:2" 是无效的,应为 "10:02"。
33+
超过表示范围(小时 0-11,分钟 0-59)的数据将会被舍弃,也就是说不会出现 "13:00", "0:61" 等时间。
34+
```
35+
36+
来源:力扣(LeetCode)
37+
链接:https://leetcode-cn.com/problems/binary-watch
38+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
39+
40+
41+
42+
## 解题思路
43+
回溯算法,我的解法类似于全排列做法,将10个小灯泡进行排列组合,然后根据 `0``1` 来判断灯泡是否亮,如果亮了,加上对应二进制,然后将 `0-3`分给小时来计算,将 `4-9`分给分钟来计算,但是要考虑一下,就是可能会出现重复情况,于是用 `Set`数据结构维护一下就好了。
44+
```javascript
45+
var readBinaryWatch = function(num) {
46+
let res = new Set();
47+
let vis = new Array(10).fill(0)
48+
let check = (hour,minutes) => {
49+
if(hour>=0 && hour<=11 && minutes>=0 && minutes<=59) return true;
50+
return false;
51+
}
52+
let dfs = (t,vis) => {
53+
if(t==0){
54+
let hour = vis[0]*1 + vis[1]*2 + vis[2]*4 + vis[3]*8;
55+
let minutes = vis[4]*1 + vis[5]*2 + vis[6]*4 + vis[7]*8 + vis[8]*16 + vis[9]*32;
56+
if(check(hour,minutes)){
57+
let tmp = `${hour}:${minutes >= 10? minutes: '0'+minutes}`;
58+
res.add(tmp);
59+
}
60+
}
61+
for(let i=0;i<10;i++){
62+
if(vis[i]) continue;
63+
vis[i] = 1;
64+
dfs(t-1,vis);
65+
vis[i] = 0;
66+
}
67+
}
68+
dfs(num,vis);
69+
return [...res];
70+
};
71+
```
72+
73+
补充,后面看到有大佬这样做,进行了去重操作,关键点在回溯 `for`循环那里。其实这个相当于全排列了。
74+
```javascript
75+
var readBinaryWatch = function(num) {
76+
let res = [];
77+
let vis = new Array(10).fill(0)
78+
let check = (hour,minutes) => {
79+
if(hour>=0 && hour<=11 && minutes>=0 && minutes<=59) return true;
80+
return false;
81+
}
82+
let dfs = (t,cnt,vis) => {
83+
if(t==0){
84+
let hour = vis[0]*1 + vis[1]*2 + vis[2]*4 + vis[3]*8;
85+
let minutes = vis[4]*1 + vis[5]*2 + vis[6]*4 + vis[7]*8 + vis[8]*16 + vis[9]*32;
86+
if(check(hour,minutes)){
87+
let tmp = `${hour}:${minutes >= 10? minutes: '0'+minutes}`;
88+
res.push(tmp);
89+
}
90+
return;
91+
}
92+
for(let i=cnt;i<=10-t;i++){
93+
if(vis[i]) continue;
94+
vis[i] = 1;
95+
dfs(t-1,i+1,vis);
96+
vis[i] = 0;
97+
}
98+
}
99+
dfs(num,0,vis);
100+
return res;
101+
};
102+
```
103+
104+
## 最后
105+
文章产出不易,还望各位小伙伴们支持一波!
106+
107+
往期精选:
108+
109+
<a href="https://github.com/Chocolate1999/Front-end-learning-to-organize-notes">小狮子前端の笔记仓库</a>
110+
111+
<a href="https://yangchaoyi.vip/">访问超逸の博客</a>,方便小伙伴阅读玩耍~
112+
113+
![](https://img-blog.csdnimg.cn/2020090211491121.png#pic_center)
114+
115+
```javascript
116+
学如逆水行舟,不进则退
117+
```
118+
119+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /