Binary Watch

题目描述:

https://leetcode-cn.com/problems/binary-watch/

题目过长,就不多描述了,直接点链接即可。

思路:列举m个小时灯亮,n个分钟灯亮的情况下的各种小时和分钟的值,并且排列组合即可。(m+n==num)

#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
using namespace std; 

/*
这个函数是用来列举num个小时灯亮的情况下的小时的值或num个分钟灯亮的情况下分钟的值 
arr:存放二进制数
length:数组长度
list:存放列举出的加数和 
num:加数的个数 
limit:数相加最大值
sum:所取的数相加之和 
times:第几次取数 
*/ 
void Permutation(int arr[],int length,vector<int>& list,int num,int limit,int start,int sum,int times)
{
	if(times==num)
	{
	     list.push_back(sum);
	     return;
	}
	else
	{
		for(int i=start;i<length;++i)
		{
		    if(arr[i]+sum<=limit)
                    Permutation(arr,length,list,num,limit,i+1,sum+arr[i],times+1);    
		}
	}
}

vector<string> readBinaryWatch(int num) 
{
	vector<string> result;
	//小时灯最多亮三个,分钟灯最多亮五个 
	if(num>8)
	   return result;
	vector<int> hours;
	vector<int> minutes;
	int hour[] = {1,2,4,8};
	int minute[] = {1,2,4,8,16,32};
	//小时不可能是四个数相加,四个数相加就会超过11 
	int count = num<=3?num:3;
	for(int i=0;i<=count;++i)
	{
		if(num-i<6)
		{
		    //列举出所有可能的小时和分钟 
		    Permutation(hour,4,hours,i,11,0,0,0);
                    Permutation(minute,6,minutes,num-i,59,0,0,0);
                    //组合所列举出的小时和分钟,并放入结果集 
                    for(int j=0;j<hours.size();++j)
			    for(int k=0;k<minutes.size();++k)
			    {
			    	string str,str1,str2;
			    	//将int转化为string 
			    	stringstream ss;
			    	ss<<hours[j];
			    	ss>>str1;
			    	ss.clear();
			    	ss<<minutes[k];
			    	ss>>str2;
			        str = str1+(minutes[k]<10?":0":":")+str2;			        
			    	result.push_back(str);
			    }
                    hours.clear();
                    minutes.clear();
		} 		
	} 
    return result;    
}
int main(){
	int num = 3;
	vector<string> result = readBinaryWatch(num);
	for(int i=0;i<result.size();++i)
	    printf("%s\n",result[i].c_str()); 
	return 0;	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值