Likou401。バイナリ時計

タイトル説明

バイナリ時計の上部には数時間(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;
}

LeetCodeリンク

おすすめ

転載: blog.csdn.net/qq_44722674/article/details/111808355