[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()技巧+二进制枚举)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode:二进制手表401

401. 二进制手表

401. 二进制手表

401. 二进制手表

LeetCode 401. Binary Watch(二进制手表)

洛谷P2104·模拟二进制