[M模拟] lc401. 二进制手表(模拟+位运算技巧+sprintf()技巧+二进制枚举)
Posted Ypuyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[M模拟] lc401. 二进制手表(模拟+位运算技巧+sprintf()技巧+二进制枚举)相关的知识,希望对你有一定的参考价值。
1. 题目来源
链接:401. 二进制手表
2. 题目解析
模拟就行了。
总共 10 个灯,枚举这 10 个灯的亮、灭情况即可。
由于本题需要使用格式化输出,所有可以用 sprintf()
来简化代码。
利用位运算巧妙取出前 4 位和后六位的二进制数的 10 进制表示。
时间复杂度: O ( 2 10 ) O(2^{10}) O(210)
空间复杂度: O ( n ) O(n) O(n)
sprintf()
格式化输出:
class Solution {
public:
vector<string> readBinaryWatch(int turnedOn) {
vector<string> res;
char str[10];
for (int i = 0; i < 1 << 10; i ++ ) {
int t = 0;
for (int k = i; k; k -= k & -k) t ++ ;
if (t == turnedOn) {
int h = i >> 6, m = i & 63; // 位运算技巧,返回小时(高四位),分钟(低六位)
if (h < 12 && m < 60) {
sprintf(str, "%d:%02d", h, m); // 组织成字符串放入 str 字符数组中
res.push_back(str);
}
}
}
return res;
}
};
二进制枚举:
class Solution {
public:
vector<string> readBinaryWatch(int turnedOn) {
vector<string> res;
for (int i = 0; i < 1 << 4; i ++ )
for (int j = 0; j < 1 << 6; j ++ ) {
int t = 0, h = 0, m = 0;
for (int k = 31; ~k; k -- ) {
int c = i >> k & 1;
h = h * 2 + c;
if (c) t ++ ;
}
for (int k = 31; ~k; k -- ) {
int c = j >> k & 1;
m = m * 2 + c;
if (c) t ++ ;
}
if (t != turnedOn) continue;
if (m >= 60 || h >= 12) continue;
string s;
s += to_string(h);
s += ":";
if (m < 10) s += '0', s += to_string(m);
else s += to_string(m);
res.push_back(s);
}
return res;
}
};
以上是关于[M模拟] lc401. 二进制手表(模拟+位运算技巧+sprintf()技巧+二进制枚举)的主要内容,如果未能解决你的问题,请参考以下文章