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;
	
    }
}