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:

  • The order of output does not matter.
  • The hour must not contain a leading zero, for example "01:00" is not valid, it should be "1:00".

  • 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".



#i nclude <bitset>


using std::bitset;

表3-6  初始化bitset对象的方法


bitset<n> b;


b有n位,每位都为0


bitset<n> b(u);


b是unsigned long型u的一个副本


bitset<n> b(s);


b是string对象s中含有的位串的副本


bitset<n> b(s, pos, n);


b是s中从位置pos开始的n个位的副本


1. 用unsigned值初始化bitset对象


当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式。而bitset对象中的位集作为这种位模式的副本。如果bitset类型长度大于unsigned long值的二进制位数,则其余的高阶位置为0;如果bitet类型长度小于unsigned long值的二进制位数,则只使用unsigned值中的低阶位,超过bitet类型长度的高阶位将被丢弃。


在32位unsigned long的机器上,十六进制值0xffff表示为二进制位就是十六个1和十六个0(每个0xf可表示为1111)。可以用0xffff初始化bitset对象:


// bitvec1 is smaller than the initializer


bitset<16> bitvec1(0xffff);          // bits 0 ... 15 are set to 1


// bitvec2 same size as initializer


bitset<32> bitvec2(0xffff);          // bits 0 ... 15 are set to 1; 16 ... 31 are 0


// on a 32-bit machine, bits 0 to 31 initialized from 0xffff


bitset<128> bitvec3(0xffff);         // bits 32 through 127 initialized to zero


上面的三个例子中,0到15位都置为1。由于bitvec1位数少于unsigned long的位数,因此bitvec1的初始值的高阶位被丢弃。bitvec2和unsigned long长度相同,因此所有位正好放置了初始值。bitvec3长度大于32,31位以上的高阶位就被置为0。


2. 用string对象初始化bitset对象


当用string对象初始化bitset对象时,string对象直接表示为位模式。从string对象读入位集的顺序是从右向左:


string strval("1100");


bitset<32> bitvec4(strval);


bitvec4的位模式中第2和3的位置为1,其余位置都为0。如果string对象的字符个数小于bitset类型的长度,则高阶位将置为0。


string对象和bitset对象之间是反向转化的:string对象的最右边字符(即下标最大的那个字符)用来初始化bitset对象的低阶位(即下标为0的位)。当用string对象初始化bitset对象时,记住这一差别很重要。


不一定要把整个string对象都作为bitset对象的初始值。相反,可以只用某个子串作为初始值:


string str("1111111000000011001101");


bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100


bitset<32> bitvec6(str, str.size() - 4);     // use last 4 characters


这里用str中从str[5]开始包含四个字符的子串来初始化bitvec5。照常,初始化bitset对象时总是从子串最右边结尾字符开始的,bitvec5的从0到3的二进制位置为1100,其他二进制位都置为0。如果省略第三个参数则意味着取从开始位置一直到string末尾的所有字符。本例中,取出str末尾的四位来对bitvec6的低四位进行初始化。bitvec6其余的位初始化为0。这些初始化过程的图示如下:






多种bitset操作(表3-7)用来测试或设置bitset对象中的单个或多个二进制位:


表3-7  bitset操作


b.any()


b中是否存在置为1的二进制位?


b.none()


b中不存在置为1的二进制位吗?


b.count()


b中置为1的二进制位的个数


b.size()


b中二进制位的个数


b[pos]


访问b中在pos处的二进制位


b.test(pos)


b中在pos处的二进制位是否为1?


b.set()


把b中所有二进制位都置为1


b.set(pos)


把b中在pos处的二进制位置为1


b.reset()


把b中所有二进制位都置为0


b.reset(pos)


把b中在pos处的二进制位置为0


b.flip()


把b中所有二进制位逐位取反


b.flip(pos)


把b中在pos处的二进制位取反


b.to_ulong()


用b中同样的二进制位返回一个unsigned long值


os << b


把b中的位集输出到os流





因为自己写的代码太直接了 所以贴上大佬的操作:
LeetCode 401. Binary Watch 解题报告 - 骆小坑的填坑之旅 - 博客频道 - CSDN.NET  http://blog.csdn.net/camellhf/article/details/52738031

class Solution {
public:
    vector<string> readBinaryWatch(int num) {
        vector<string> times;


        for (int i = 0; i < 12; i++) {
            bitset<4> h((size_t) i);
            for (int j = 0; j < 60; j++) {
                bitset<6> m((size_t) j);
                if (h.count() + m.count() == num)
                    times.push_back(to_string(i) + (j < 10? ":0": ":") + to_string(j));
            }
        }


        return times;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值