leetcode89: Gray Code

要求:编写格雷码,格雷码的位数为n

注意:掌握编码方式就很简单了。编码方式如下:

上一次假设有k个码,那么在k个码后面再写k个码,顺序是前k个码的倒序

前面k个码首位补“0”,后面k个码首位补“1”

例如:

已知序列 0  1

k=2

得到长度为2*k=4的新序列 0  1 || 1  0

前两个码首位补“0”,后面2个码首位补“1”

得到最终结果00 01 || 11 10

n=0 0

n=1 0 || 1

n=2 00 01 || 11 10

n=3 000 001 011 010 || 100 101 111 110

...


(顺便提一句,为什么要用格雷码?因为格雷码前后码元只有1bit不同,所以在使用类似QAM这种调制方式时,接收端就算判决出现一次错误,也只会使整个序列只有1bit的错误。感谢通信原理老师...)

	public List<Integer> grayCode(int n) {
		ArrayList list = new ArrayList();
		list.add(0);
		int count = 1;
		if (n == 0)
			return list;

		while (count <= n) {
			ArrayList o = code(list);
			count++;
			list.clear();
			list.addAll(o);
		}
		return list;
	}

	public static ArrayList<Integer> code(ArrayList<Integer> l) {
		ArrayList newlist = new ArrayList();
		newlist.addAll(l);
		int[] nums = new int[l.size()];
		for (int i = 0; i < l.size(); i++)
			nums[i] = Integer.parseInt(String.valueOf(l.get(i))) + l.size();
		for (int i = nums.length - 1; i >= 0; i--)
			newlist.add(nums[i]);
		return newlist;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值