J'ai une array
de int
comme entrée. Le tableau aura toujours une longueur de 2^n
. Je veux couper le tableau en deux et l'empiler. Répétez la coupe et l'empilage jusqu'à ce qu'il n'y ait plus qu'une seule pile. Par exemple:Couper et empiler la matrice
int[] array = {1,2,3,4,5,6,7,8}
si on coupe le tableau en deux nous et empilez ce serait:
{1,2,| 3,4}
{5,6,| 7,8}
couper et empiler à nouveau:
{1,|2}
{5,|6}
{3,|4}
{7,|8}
nouveau:
{1}
{5}
{3}
{7}
{2}
{6}
{4}
{8}
la sortie désirée serait un tableau d'entiers à partir du haut à l'extrémité de la pile
int[] output = {1,5,3,7,2,6,4,8}
j'ai essayé de construire le tableau de sortie par bouclage du tableau d'entrée d'une manière particulière. Notez que lorsque j'atteins le tableau, je recommence à partir de la tête. Je commence à array[i]
où i = 0
. Je reçois le premier numéro de cette façon. alors j'incrémente i
par n où n
est le log(array.legnth)
(base 2). C'est comme ça que je reçois le deuxième numéro. Pour le troisième nombre, nous incrémentons i
par (n + n/2). Pour le quatrième chiffre, nous incrémentons à nouveau i
par n
. Je me demande s'il y a un modèle? Ou quelle serait votre approche pour résoudre ce problème? Je suis à la recherche d'une solution en Java ou en python.
Modifier/Mise à jour:
j'ai essayé une nouvelle approche à l'aide queue
. Je continue fondamentalement à couper le tableau en deux et à pousser les deux moitiés du tableau dans la file d'attente jusqu'à ce que les tableaux dans la file d'attente aient tous une longueur de 2 (ou que la pile soit à la hauteur n). mais mon résultat n'est pas correct. Je pense que cela a à voir avec l'ordre que j'ajoute les demi-tableaux dans la file d'attente.
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;
}
}
Résultat:
1
3
5
7
2
4
6
8
comment pourrais-je résoudre ce problème?
mise à jour: Je l'ai résolu et posté ma propre réponse. mais je suis toujours curieux de savoir comment les autres pourraient résoudre cela. Merci de ne pas hésiter à répondre.
* S'il vous plaît ramasser une * langue. Ensuite, éditez votre question pour avoir cette langue en tant que balise, et incluez également un [Exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) de ce que vous avez essayé avec une description de comment n'a pas fonctionné comme prévu. Et si vous ne l'avez pas fait récemment, alors s'il vous plaît prenez le temps de [lire sur la façon de poser de bonnes questions] (http://stackoverflow.com/help/how-to-ask) à nouveau. –