格雷码(从零基础讲解,C++版)
格雷碼題目講解(C++版)
- 格雷碼簡介
- 經(jīng)典例題
- ??題目展示
- ??題目講解
- ??代碼解題
??小白在這胡說八道,有不足的地方歡迎大佬們斧正ˋ( ° ▽、° )
格雷碼簡介
詳解見百度百科,這里只敲重點淺談幾個方面
經(jīng)典例題
??題目展示
LeetCode - 使整數(shù)變?yōu)?0 的最少操作次數(shù)(題目編號:1611)
level: Hard
Subject:
??給你一個整數(shù) n(0 <= n <= 109),你需要重復(fù)執(zhí)行多次下述操作將其轉(zhuǎn)換為 0
返回將 n 轉(zhuǎn)換為 0 的最小操作次數(shù)
Example 1:
輸入:n = 3
輸出:2
解釋:3 的二進制表示為 “11”
“11” -> “01” ,執(zhí)行的是第 2 種操作,因為第 0 位為 1
“01” -> “00” ,執(zhí)行的是第 1 種操作
Example 2:
輸入:n = 6
輸出:4
解釋:6 的二進制表示為 “110”.
“110” -> “010” ,執(zhí)行的是第 2 種操作,因為第 1 位為 1 ,第 0 到 0 位為 0
“010” -> “011” ,執(zhí)行的是第 1 種操作
“011” -> “001” ,執(zhí)行的是第 2 種操作,因為第 0 位為 1
“001” -> “000” ,執(zhí)行的是第 1 種操作
??題目講解
??仔細觀看題目需要執(zhí)行的操作,發(fā)現(xiàn)本質(zhì)上就是典型格雷碼的枚舉規(guī)則,我們可以翻譯題目需求為 “格雷碼需要向0方向枚多少次才變成0,即解碼成0”,本文講解的運算規(guī)則有枚舉、編碼、解碼
- 枚舉 - 格雷碼從小變大遵循的規(guī)則
1.第一步改變最右邊的位元(1變0,0變1)
2.第二步改變右起第一個為1的位元的左邊位元(1變0,0變1)
3.如此反復(fù)第一步、第二步
- 枚舉 - 格雷碼從大變小遵循的規(guī)則
1.第一步改變最右邊的位元(1變0,0變1)
2.第二步改變右起第一個為1的位元的左邊位元(1變0,0變1)
3.如此反復(fù)第一步、第二步 - 編碼 - 二進制轉(zhuǎn)格雷碼
原理:如果二進制碼字的第 i 位和 i+1 位(從右邊開始數(shù))相同,則對應(yīng)的格雷碼的第i位為0,否則為1(當i+1=n時,二進制碼字的第n位被認為是0,即第n-1位不變)
- 解碼 - 格雷碼轉(zhuǎn)換成二進制
原理:從左邊第二位起,將每位與左邊一位解碼后的值進行異或,作為該位解碼后的值(最左邊一位依然不變),直到最低位。
??代碼解題
按上面的模板來說,第一種是直接套用“解碼”的模板
/* 第一種模板 */ #include<math.h> // log對數(shù)函數(shù)需要用到的頭文件 #include <iostream> using namespace std;int gray_decode(int num) {int head;if(!num) return 0;head = 1 << int(log(num) / log(2));return head + gray_decode((num^head) ^ (head>>1)); }int main() {int n = 0;cin >> n;gray_decode(n); }第二種是較簡潔的模板(注解待完善)
/* 第二種模板 */ #include <iostream> #include <cmath> using namespace std;int minimumOneBitOperations(int n) {int result = 0;while(n){result ^= n;n >>= 1; }return result; }int main() {int n = 0;cin >> n;minimumOneBitOperations(n); }路漫漫其修遠兮,吾將上下而求索
總結(jié)
以上是生活随笔為你收集整理的格雷码(从零基础讲解,C++版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android手机通过笔记本无线wifi
- 下一篇: s3c2440移植MQTT