[程式設計題] 生成格雷碼
在一組數的編碼中,若任意兩個相鄰的**只有一位二進位制數不同, 則稱這種編碼為格雷碼(gray code),請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。
給定乙個整數n,請返回n位的格雷碼,順序為從0開始。
測試樣例:
1
返回:["0","1"]
思想:
用遞迴法實現,把求n位格雷碼分解為求n-1位格雷碼的子問題,以及如何由n-1位格雷碼構造n位格雷碼的子問題。
第二個子問題,即依次遍歷格雷碼,在每一編碼的末尾新增「0」或"1"。
用c++實現,如下**
// graycode.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include#include#includeusing namespace std;
class graycode if (n <= 0)
vectorpost = getgray(n - 1);
bool direction = true;
for (vector::iterator itr = post.begin(); itr != post.end(); itr++)
else
} return ret;
}};int main()
} return 0;
}
語言要點:
使用vector容器,vectorvs = vector()定義容器;
vs.push_back()往容器末尾新增元素;
vector::iterator 獲得迭代器型別;
vector::iterator it = vs.begin()得到迭代器頭;
it != vs.end()判斷迭代器是否還未結束;
it++將迭代器指向下乙個元素;
*it 表示取迭代器當前指向的那個元素。
go實現
package main
import (
"container/list"
"errors"
"fmt"
"strconv"
"strings"
)func main() }}
func garycode(n int) (ret *list.list, _ error)
ret = list.new()
if n == 1 else else
} }return ret, nil
}
語言要點:
通過 fmt.scanln() 從標準輸入讀取一行字串,字串包含換行符
通過strings.replace()函式,替換掉多餘的空格和換行符;
通過strconv.atoi()函式,把字串轉換成整數
使用list容器,通過 ret := list.new() 建立並返回list列表指標;
ret.pushback()往列表末尾新增元素;
通過e := gc.front()獲取列表頭元素指標;
通過 e != nil 判斷當前指向元素不為空;
通過e.next()指向列表下乙個元素;
通過e.value()取e指向元素的值,元素的型別是inte***ce,通過.(string)強調元素值型別是string;合在一起就是e.value().(string)。
吐槽:go語言真是沒說的那麼好用,麻煩。
生成格雷碼
題目描述 在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼 gray code 請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。給定乙個整數n,請返回n位的格雷碼,順序為從0開始。測試樣例 1返回 0 1 1 n 1時,返回0,1 2 n 2時,返回00,01,10,...
自動生成格雷碼
出處 blog.csdn.net beiyeqingteng 問題 產生n位元的所有格雷碼。格雷碼 gray code 是乙個數列集合,每個數使用二進位來表示,假設使用n位元來表示每個數字,任兩個數之間只有乙個位元值不同。例如以下為3位元的格雷碼 000 001 011 010 110 111 10...
遞迴生成格雷碼
遞迴生成格雷碼 當n 1時,當n 2時,當n 3時,n位格雷碼共有2 n個元素。其中每個元素是 n 1 位的格雷碼前面加0,然後再反向後前面加1生成的。如n 3可由n 2進行兩步操作後得到 1.在n 2的格雷碼前面加0,生成 000,001,011,010 2.在n 2的格雷碼逆序後前面加1,生成 ...