タイトル説明
バイナリ時計の上部には数時間(0〜11)の4つのLEDがあり、下部には数分(0〜59)の6つのLEDがあります。
各LEDは0または1を表し、最下位ビットが右側にあります。
たとえば、上記のバイナリ時計は「3:25」と表示されます。
オンになっているLEDの現在の数を表す負でない整数nが与えられた場合、可能なすべての時間を返します。
例:
入力: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」にする必要があります。
分は2桁で構成されている必要があり、ゼロで始まる場合があります。たとえば、「10:2」は無効であり、「10:02」である必要があります。
表示範囲(0〜11時間、0〜59分)を超えるデータは破棄されます。つまり、「13:00」、「0:61」などの時間は表示されません。
問題解決のアイデア
ハミング重み関数を使用して、10進数に対応する2進文字列の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;
}