我有一个array
的int
作为输入。数组总是长度为2^n
。我想把数组切成两半并堆叠起来。重复切割和堆叠,直到只有一个堆叠。例如:切割和堆叠阵列
int[] array = {1,2,3,4,5,6,7,8}
如果我们削减了一半的阵列,我们和堆栈他们来说,这将是:
{1,2,| 3,4}
{5,6,| 7,8}
切割并重新堆栈:再次
{1,|2}
{5,|6}
{3,|4}
{7,|8}
:
{1}
{5}
{3}
{7}
{2}
{6}
{4}
{8}
所需的输出将是整数的数组从顶部到堆栈
int[] output = {1,5,3,7,2,6,4,8}
我曾尝试通过循环输入数组以特定的方式来构造输出数组的末尾。请注意,当我到达阵列时,我只是再次从头开始。我从array[i]
开始,其中i = 0
。我以这种方式得到第一个数字。那么我增加i
n,其中n
是log(array.legnth)
(基数2)。这是我如何得到第二个数字。对于第三个数字,我们增加i
(n + n/2)。对于第四个数字,我们再次增加i
n
。我想知道有没有一种模式?或者你会怎样解决这个问题?我正在寻找java或python中的解决方案。
编辑/更新:
我试图用queue
一种新的方法。我基本上保持切割数组的一半,并将数组的一半推入队列,直到队列中的数组全部长度为2(或堆栈高度为n)。但我的结果是不正确的。我认为它与我将半数组添加回队列的顺序有关。
import java.util.*;
public class StackArray{
public static void main(String[] args){
int[] array = {1,2,3,4,5,6,7,8};
int[] answer = stackArray(array);
for(int n : answer){
System.out.println(n);
}
}
public static int[] stackArray(int[] array){
int height = (int) (Math.log(array.length)/Math.log(2)) + 1;
Queue<int[]> queue = new LinkedList<int[]>();
ArrayList<Integer> list = new ArrayList<>();
queue.add(array);
while(queue.size() < height){
int currentLength = queue.size();
int i = 0;
while(i < currentLength){
int[] temp = queue.poll();
int[] array1 = new int[temp.length/2];
int[] array2 = new int[temp.length/2];
System.arraycopy(temp, 0, array1, 0, array1.length);
System.arraycopy(temp, array1.length, array2, 0, array2.length);
queue.add(array1); //I think the problem is here
queue.add(array2);
i++;
}
}
int y = 0;
while(y < 2){
for(int i = 0; i < queue.size(); i++){
int[] curr = queue.poll();
list.add(curr[y]);
queue.add(curr);
}
y++;
}
int[] ret = new int[list.size()];
for(int i = 0; i < list.size(); i++){
ret[i] =list.get(i);
}
return ret;
}
}
结果:
1
3
5
7
2
4
6
8
我将如何解决这一问题?
更新:我解决了它,并张贴了我自己的答案。但我仍然很好奇,其他人如何解决这个问题。请随时回答。
请选择一个* *语言。然后编辑您的问题以将该语言作为标记,并且还包括您已经尝试过的[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)以及对它的描述没有按预期工作。如果你最近没有做过,那么请花一些时间再读一遍[阅读如何提出好问题](http://stackoverflow.com/help/how-to-ask)。 –