[Dúvida] Rodar elementos do vector para a direita

Boa tarde!

Eu estou tentando rodar os elementos de um vector para a direita mas só consigo trocar o último elemento.

Eu queria que o meu programa fizesse isto:

vector original: 3 2 1
vector rodado para a direita: 1 3 2

public static int[] rotacao(int[] v, int N) { int[] v_rod = new int[N]; for (int i = N - 1; i >= 0; i--) { v_rod[N - 1 - i] = v[i]; } return v_rod; }

Este método recebe como parâmetro um vector e a sua respectiva capacidade, depois limita-se a rodar os elementos do vector para a direita e retornar o vector rodado.
Conto com vossa ajuda.
Obrigado.
Cumps

“fize-se” dói na vista. Descontando isso:

Seu exemplo é ruim, isso porque tanto faz, com o seu exemplo, rodar para a direita, ou simplesmente espelhar o vetor.

Use o seguinte exemplo:

Vetor original: 1 2 3 4
Vetor final: 4 1 2 3

Para remover um nó de uma lista, esta lista deve conter, no mínimo, 1 nó, ou seja, n>0.
A remoção do k-ésimo nó de uma lista implica no deslocamento para frente os nós xk+1, xk+2, …, xn-2, xn-1.

int lstRemover(Lista * l, int k, lstInfo * val) {

if((k >= 0) && (k < l->n)){ /* Não é necessário testar se n > 0, pois
* se n = 0, então k < n é falso para k >= 0
*/

int i;

*val = l->itens[k];

for(i = k; i < l->n-1; i++) {

l->itens[i] = l->itens[i+1];

}

(l->n)--;

return TRUE;

}

return FALSE;

} 

Este Trecho:

[code]
for(i = k; i < l->n-1; i++) {

l->itens[i] = l->itens[i+1];

} [/code]

Dê uma olhada, bastaria guardar o ultimo elemento da lista.

Dê uma olhada em listas circulares:

http://www.guiadohardware.net/comunidade/lista-include/289886/

public static int[] rotacao(int[] v){ int i = v.length() -1; int[] v_rod = new int[i]; for(int cont = 0;cont<=i;cont++){ if(cont+1 != v.length()){ v_rod[cont+1] = v[cont]; }else{ v_rod[cont-i] = v[i]; } } return v_rod; }

não testei

Olá a todos.

Antes de mais peço desculpa pelos erros ortográficos entanglement, e sim, o seu exemplo veio esclarecer melhor as coisas.

douglaskd, o seu método deu-me o seguinte erro:

[list]Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 2
at PL6ex4.rotacao(PL6ex4.java:59)
at PL6ex4.main(PL6ex4.java:16)
Java Result: 1
[/list]

e tive que o alterar para esta forma, mas continuou dando erro:

public static int[] rotacao(int[] v){ int i = N -1; int[] v_rod = new int[i]; for(int cont = 0;cont<=i;cont++){ if(cont+1 != N{ v_rod[cont+1] = v[cont]; }else{ v_rod[cont-i] = v[i]; } } return v_rod; }

Amigo getAdicted, não entendi os seus exemplos, nomeadamente quando escreve coisas do género:

[list]l->n l->n-1 *val = l->itens[k];[/list]
Não dava para me dar um exemplo do género do douglaskd?

Cumprimentos e abraço

tenta assim(só estou alterando o que já tem feito)

public static int[] rotacao(int[] v){ int i = v.lenght(); int tmp; for(int cont = 0;cont<=i;cont++){ tmp = v[cont]; v[cont] = v[i-cont-1]; v[i-cont-1] = tmp; } return v; } também não testei

Olá evefuji.

Deu este erro:

[list]Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 4
at PL6ex4.rotacao(PL6ex4.java:58)
at PL6ex4.main(PL6ex4.java:16)
Java Result: 1
[/list]

e eu tive que mudar isto no código senão dava erro na atribuição de valor da variavel “i” quando a está a iniciar na segunda linha:

public static int[] rotacao(int[] v,int N){ int i = N;//foi aqui que mudei int tmp; for(int cont = 0;cont<=i;cont++){ tmp = v[cont]; v[cont] = v[i-cont-1]; v[i-cont-1] = tmp; } return v; }

package guj;

import java.util.Arrays;

public class ExemploRotacaoArray {

    public static int[] rotacaoDireita (int[] fonte) {
        int[] resultado = new int[fonte.length];
        int ultimo = fonte[fonte.length - 1];
        System.arraycopy (fonte, 0, resultado, 1, fonte.length - 1);
        resultado [0] = ultimo;
        return resultado;
    }
    
    public static void main(String[] args) {
        int[] origem = {1, 2, 3, 4};
        int[] resultado = rotacaoDireita (origem);
        int[] esperado = {4, 1, 2, 3};
        if (Arrays.equals(resultado, esperado)) {
            System.out.println ("OK");
        } else {
            System.out.println ("Incorreto");
        }
    }

}

int i = v.length; int tmp; for(int cont = 0;cont<i/2;cont++){ tmp = v[cont]; v[cont] = v[i-cont-1]; v[i-cont-1] = tmp; } return v;

assim funciona

[code]public class girando {

public static int[] rotacao(int[] v){    
    int i = v.length; 
    int[] v_rod = new int[i];   
    v_rod[0] = v[i-1];  
    for(int cont = 0;cont<i;cont++){  
   	     if(cont+1 < i){ v_rod[cont+1] = v[cont]; }       
         }
    return v_rod;    
 }   
public static void main(String args[]){
	
	int[] vz = {0, 1, 2, 3, 4}; 
	int vet[] = rotacao(vz);
	
	for(int i=0; i<=vet.length-1; i++){
	System.out.println(vz[i]+ "---"+vet[i]);
	}

}
}[/code]

outra solução

Desculpa cara,

estava enrolado com o serviço… Esquece o que eu falei, é burocracia, inclusive os exemplos que te mandei estavam em linguagem C, escuta os caras que te deram as respostas.

Obs. Lista circular é aquela em que o ultimo elemento da lista volta para o começo.

abs!

Viva!

douglaskd, usei o sei método e o output pretendido foi o seguinte:

[list]Quantos nº deseja ler?
4
Insira um nº:
4
Insira um nº:
3
Insira um nº:
2
Insira um nº:
1
Elementos do vector invertido:
1
2
3
4
Elementos do vector rodado
1
4
3
2
[/list]

Obrigado a todos por me terem ajudado.

Um abraço