Gray Code LeetCode 89
生活随笔
收集整理的這篇文章主要介紹了
Gray Code LeetCode 89
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:The gray code is a binary numeral system where two successive values differ in only one bit.
Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.
For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:
00 - 0 01 - 1 11 - 3 10 - 2這道題其實就是產生格雷碼(簡直廢話~),格雷碼是有一定規律的,數電課上學過一點格雷碼的規律,但是對于編程解決問題沒啥用啊- -,我們還是來找規律吧。4位的,我手寫最多寫4位
0000
0001
0011
0110
0111
0101
0100
1100
1101
1111
1110
1010
1011
1001
1000
按列來看,從左往右數第0列(從0列開始),前半部分為0,后半部分為1。第1列,等分成上下兩部分,第一部分的前半部分為0,后半部分為1。第二部分的前半部分為1,后半部分為0。
后面繼續看,可以看出規律了。把第i列分成2^i部分,奇數部分的前半部分為0,后半部分為1,偶數部分的前半部分為1,后半部分為0。或者用另外一種表述方法,我們可以把本次的劃分看作前一次的劃分的
一個部分,如果是上次劃分的前半部分,則符合前面的奇數部分。后半部分則符合前面的后半部分。代碼如下: 1 /* 2 使用分治法,如果本次屬于前一次二分的前半部分,則本次的前半部分第n位填0,后半部分第n位填1 3 如果本次屬于前一次二分的后半部分,則本次的前半部分第n位填1,后半部分第n位填0 4 第一次填寫,設為前半部分。代碼中left代表前半部分-_-。 5 */ 6 7 void setGray(int *num, int start, int end, bool left, int n) 8 { 9 int lbit, rbit, i = 0; 10 int mid = (start + end) >> 1; 11 12 if (left) 13 { 14 lbit = 0; 15 rbit = 1 << n; 16 } 17 else 18 { 19 lbit = 1 << n; 20 rbit = 0; 21 } 22 23 for (i = start; i <= mid; ++i) 24 num[i] = num[i] | lbit; 25 26 for (i = mid + 1; i <= end; ++i) 27 num[i] = num[i] | rbit; 28 29 if (n > 0) 30 { 31 setGray(num, start, mid, true, n - 1); 32 setGray(num, mid + 1, end, false, n - 1); 33 } 34 } 35 36 37 int *grayCode(int n, int *returnSize) 38 { 39 *returnSize = 1 << n; 40 int *ans = (int *)malloc(*returnSize * sizeof(int)); 41 int i = 0; 42 for (i = 0; i < *returnSize; ++i) 43 { 44 ans[i] = 0; 45 } 46 if (n > 0) setGray(ans, 0, *returnSize - 1, true, n - 1); 47 return ans; 48 }
?
轉載于:https://www.cnblogs.com/DennisXie/p/4792928.html
總結
以上是生活随笔為你收集整理的Gray Code LeetCode 89的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MySQL】navicat for m
- 下一篇: [转] MemCached 的 stat