题目描述
二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。
每个 LED 代表一个 0 或 1,最低位在右侧。
例如,上面的二进制手表读取 “3:25”。
给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。
示例:
输入: n = 1
返回: [“1:00”, “2:00”, “4:00”, “8:00”, “0:01”, “0:02”, “0:04”, “0:08”, “0:16”, “0:32”]
提示:
输出的顺序没有要求。
小时不会以零开头,比如 “01:00” 是不允许的,应为 “1:00”。
分钟必须由两位数组成,可能会以零开头,比如 “10:2” 是无效的,应为 “10:02”。
超过表示范围(小时 0-11,分钟 0-59)的数据将会被舍弃,也就是说不会出现 “13:00”, “0:61” 等时间。
解题思路
使用海明重量的函数计算十进制数字对应二进制串中1的个数,若小时数字和分钟数字的海明重量之和恰好为num则输出此时的时间
代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int hammingWeight(int n) {
int result=0;
while(n)
{
result+=n%2;
n>>=1;
}
return result;
}
char ** readBinaryWatch(int num, int* returnSize){
char **re =(char**)calloc(500,sizeof(char*));
int hour=0;
int minute=0;
*returnSize=0;
for(hour=0;hour<12;++hour){
for(minute=0;minute<60;++minute){
if(hammingWeight(hour)+hammingWeight(minute)==num){
re[*returnSize]=(char*)calloc(6,sizeof(char));
sprintf(re[*returnSize],"%d:%02d",hour,minute);
++(*returnSize);
}
}
}return re;
}