小米面试题目: 一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手中没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组

/*
 *题目: 一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手中没牌,
 *最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组
 *
 *解题思路:
 *取一个1~n的数组,这里为了说明取n=5。按照题目中的规则变换,得到数组:[1 3 5 4 2],
 *将该数组下标与值互换得到[1 5 2 4 3],即为答案。解释:[1 3 5 4 2]的意义是,经过变换,
 *原数组中3号位置的数字现在2号槽,原数组中5号位置的数字现在3号槽... 现在已知变换后的
 *槽存放的是1~n,故只要将下标与值互换就可得到待求数组。
 */
public class PKPai {
	/*
	 * 先默认初始牌堆为1-n,按规则法则。
	 */
	public int[] pkPai(int n) {
		// 定义一个数组,给牌赋值
		int[] m = new int[n];
		for (int i = 0; i < m.length; i++) {
			m[i] = i + 1;
		}
		int[] j = new int[n];// 桌子上牌的数组
		int count = 0;
		while (count < n) {
			// 一直抽牌,第一张放桌子上,第二张放牌低,循环操作
			for (int i = 0; i < m.length; i++) {
				if (i % 2 == 0) {
					j[count] = m[i];
					count++;
				}
				// 扩容数组:每在牌低加一张便算作数组扩容+1
				if (i % 2 == 1) {
					int l = m[i];
					m = Arrays.copyOf(m, m.length + 1);
					m[m.length - 1] = l;
				}
			}
			// 反转序列
			// Collections.reverse(list);
		}
		return j;
	}

	// 传入默认1-n牌堆发牌的数组,交换坐标的到需要得到的序列
	public int[] pai(int[] j) {
		int length = j.length;
		// 定义接收新排序的数组
		int[] r = new int[length];
		int count = 0;
		// 置换排序
		for (int i = length; i > 0; i--) {
			r[j[count] - 1] = i;
			count++;
		}
		return r;
	}

	public static void main(String[] args) {
		PKPai pkPai = new PKPai();
		int[] p = pkPai.pkPai(9);
		int[] pai = pkPai.pai(p);
		for (int i = 0; i < pai.length; i++) {
			System.out.print(pai[i] + " ");
		}
	}
}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值