您的位置:首页 > 其它

lintcode--二进制时间

2018-01-03 16:50 260 查看
题目描述:

给了一个二进制显示时间的手表和一个非负整数 n, n 代表在给定时间表上 1 的数量, 返回所有可能的时间。

注意事项:

输出的顺序没有要求.

小时不能包含前导零, 比如 “01:00” 是不允许的, 应该为 “1:00”.

分钟必须由两位数组成, 可能包含前导零, 比如 “10:2” 是无效的, 应该为 “10:02”.

样例:

给出 n = 1

返回 [“1:00”, “2:00”, “4:00”, “8:00”, “0:01”, “0:02”, “0:04”, “0:08”, “0:16”, “0:32”]

思路讲解:

首先我们弄懂什么是二进制手表,通常的二进制手表用4位二进制表示小时,4位二进制可以表示0~15,但表示小时的只用0~12:0000~1100,LED点亮表示1,熄灭表示0;用6位二进制表示分钟,6位二进制可以表示0~63,但表示分钟的只用0~59:000000~111011,仍然是LED点亮表示1,熄灭表示0。



故我们可以简化这个手表,就是一个10位的二进制,前六位为分钟,后四位为小时,题目说1的个数,这样我们就可以利用深度搜索,递归在10个位置中放置1,

代码详解:

class Solution {
public:
/*
* @param : the number of "1"s on a given timetable
* @return: all possible time
*/
vector<string> binaryTime(int num) {
// Write your code here
vector<int>watch;
for(int i=0;i<10;i++){
watch.push_back(0);
}
vector<string>res;
findtime(watch,res,0,num,0);
return res;

}
void findtime(vector<int>&watch,vector<string>&res,int index,int num,int count)
{
if(count==num){//找到满足条件的时间,将其加入数组中
if(array_to_time(watch)!=""){
res.push_back(array_to_time(watch));
}
return;
}
for(int i=index;i<10;i++){
watch[i]=1;
findtime(watch,res,i+1,num,count+1);
watch[i]=0;
}
}
string array_to_time(vector<int>res)
{
int min=0;
int hour=0;
for(int i=0;i<6;i++){
min=min+pow(2,i)*res[i];
}
for(int i=6;i<10;i++){
hour=hour+pow(2,i-6)*res[i];
}
if(hour>=12||min>=60){//由于时间是在0:00--11:59之间,超过这个的就排除掉
string s="";
return s;
}
if(min<10){//由于分钟必须由两位数组成, 可能包含前导零,故min小于10时,我们需要在其前面加0
string s="";
s=s+to_string(hour)+":0"+to_string(min);
return s;
}else{
string s="";
s=s+to_string(hour)+":"+to_string(min);
return s;
}
}
void printvector(vector<int>res){
for(int i=0;i<res.size();i++){
cout<<res[i]<<" ";
}
cout<<endl;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: