Pregunta

Pensé que lo tenía,

void shiftArray(NSMutableArray *mutableArray, NSUInteger shift)
{
    for (NSUInteger i = 0; i < [mutableArray count]; i++) {
        NSUInteger newIndex = (i + shift) % [mutableArray count];
        [mutableArray exchangeObjectAtIndex:i withObjectAtIndex:newIndex];
    }
}

que convierte 0,1,2,3,4 en 0,2,3,4,1 cuando cambio por uno.

El resultado esperado es 4,0,1,2,3

Siento que me falta algo obvio ...

Actualización: Gracias Matthieu, así es como se ve mi función ahora.

void shiftArrayRight(NSMutableArray *mutableArray, NSUInteger shift) {
    for (NSUInteger i = shift; i > 0; i--) {
        NSObject *obj = [mutableArray lastObject];
        [mutableArray insertObject:obj atIndex:0];
        [mutableArray removeLastObject];
    }
}

No sabía que podía hacer un NSObject genérico y ponerle una subclase. Todo son solo punteros, así que supongo que está bien, ¿verdad?

Es difícil romper el hábito de pensar en estos objetos como bolsas en lugar de punteros a la bolsa.

¿Fue útil?

Solución

Pruebe algo como

for (NSUInteger i = shift; i > 0; i--) {
   NSObject* obj = [mutableArray lastObject];
   [mutableArray insertObject:obj atIndex:0];
   [mutableArray removeLastObject];
}

CAVEAT - No he probado ese código, pero eso debería ayudarlo a resolver el problema.

Otros consejos

Necesitas mirar nuevamente tu algoritmo. Cada vez que realiza el ciclo, intercambia un elemento con (en el caso de shift = 1) el siguiente.

0,1,2,3,4
1 , 0 , 2,3,4
1, 2 , 0 , 3,4
1,2, 3 , 0 , 4
1,2,3, 4 , 0
0 , 2,3,4, 1

Puede realizar la operación que desea, pero debe pensar en cómo ordenar los pasos y sus dependencias para obtener el resultado correcto. En el caso trivial, puedes trabajar hacia atrás desde el final.

0,1,2,3,4
4 , 1,2,3, 0
4,1,2, 0 , 3
4,1, 0 , 2 , 3
4, 0 , 1 , 2,3

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top