/*
*题目: 一副从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到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手中没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组
猜你喜欢
转载自blog.csdn.net/weixin_42038771/article/details/81879300
今日推荐
周排行