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,
代码详解:
给了一个二进制显示时间的手表和一个非负整数 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; } };
相关文章推荐
- lintcode在O(1)时间复杂度删除该链表节点。
- LintCode-剑指Offer-(365)二进制中有多少个1
- LintCode : 二进制表示
- [LintCode]372.在O(1)时间复杂度删除链表节点
- python_lintcode_64合并排序数组 II_60搜索插入位置_142 O(1)时间检测2的幂次
- 求1到n ,这n个整数的二进制表示比特1的个数(时间复杂度:O(n))
- [LintCode] Median(期望时间复杂度O(n)求中位数和第k大数)
- 【LintCode 简单】142. O(1)时间检测2的幂次
- [LintCode] Majority Number(以时间复杂度O(n)求主元素)
- LintCode之408 二进制求和
- lintcode--二进制有多少个1
- lintcode 二进制求和 给定两个二进制字符串,返回他们的和(用二进制表示)。
- Lintcode 408 二进制求和
- lintcode——在O(1)时间复杂度删除链表节点
- 372. 在O(1)时间复杂度删除链表节点 (delete-node-in-the-middle-of-singly-linked-list)(c++)----lintcode面试题之链表
- -1用二进制怎么表示 按默认排序 | 按时间排序 最佳回答 2007-03-20huguquan | 五级 原码是10000001 反码是11111110 补码是11111111 补码是计算机的一般表
- O(n)时间解决的面试题:二进制矩阵中1的个数
- 巧用SQL Server日期类型数据二进制输出计算时间差
- 二进制中1的个数以及时间比较
- LintCode 更新二进制位