LeetCodeグレイコードシーケンスの生成
1401 ワード
問題の概要:1組の数の符号化において、任意の2つの隣接するコードが1ビットのバイナリ数だけ異なる場合、この符号化をグレイ符号と呼ぶ.2桁のグレイコードシーケンス:00:001:111:310:2法則を探す:nビットのグレイコードが要求される場合、まずn-1ビットのグレイコードが要求される.前回のグレイコードの各ビットを循環すると、2つの新しいグレイコードが生成されます.統計'1'の出現回数が偶数の場合:2つの新しいグレイコードがそれぞれxxx 1とxxx 0の場合奇数:2つの新しいグレイコードがそれぞれxxx 0とxxx 1の場合、3ビットのグレイコードを例にとります.00から:000=00+(0)001=00+(1)01から:011=01+(1)010=01+(0)11から:110=11+(0)111=11+(1)10から:101=10+(1)100=10+(0)
次に、新しいグレイコードをシーケンスに追加して、次のグレイコードシーケンスの計算に使用します.
実装コード:
次に、新しいグレイコードをシーケンスに追加して、次のグレイコードシーケンスの計算に使用します.
実装コード:
public class Solution {
public IList<int> GrayCode(int n) {
if(n < 0){
return new List<int>();
}
if(n == 0){
return new List<int>{0};
}
if(n == 1){
return new List<int>(){0,1};
}
if(n == 2){
return new List<int>{0,1,3,2};
}
var r = new List<string>(){"00","01","11","10"};
for(var i = 3;i <= n; i++){
var tmp = new List<string>();
for(var j = 0;j < r.Count; j++){
var countOne = 0;
foreach(var c in r[j]){
if(c == '1'){
countOne ++;
}
}
if(countOne % 2 == 0){
tmp.Add(r[j]+"0");
tmp.Add(r[j]+"1");
}
else{
tmp.Add(r[j]+"1");
tmp.Add(r[j]+"0");
}
}
r = tmp;
}
var ret = new List<int>();
foreach(var s in r){
var num = Convert.ToInt32(s,2);
ret.Add(num);
}
return ret;
}
}