Java - Rotating array

后端 未结 14 1125

So the goal is to rotate the elements in an array right a times. As an example; if a==2, then array = {0,1,2,3,4} would become

14条回答
  •  北海茫月
    2020-11-27 19:39

    Time Complexity = O(n)

    Space Complexity = O(1)

    The algorithm starts with the first element of the array (newValue) and places it at its position after the rotation (newIndex). The element that was at the newIndex becomes oldValue. After that, oldValue and newValue are swapped.

    This procedure repeats length times.

    The algorithm basically bounces around the array placing each element at its new position.

    unsigned int computeIndex(unsigned int len, unsigned int oldIndex, unsigned int times) {
        unsigned int rot = times % len;
        unsigned int forward = len - rot;
    
        // return (oldIndex + rot) % len; // rotating to the right
        return (oldIndex + forward) % len; // rotating to the left
    }
    
    void fastArrayRotation(unsigned short *arr, unsigned int len, unsigned int rotation) {
        unsigned int times = rotation % len, oldIndex, newIndex, length = len;
        unsigned int setIndex = 0;
        unsigned short newValue, oldValue, tmp;
    
        if (times == 0) {
            return;
        }
    
        while (length > 0) {
            oldIndex = setIndex;
            newValue = arr[oldIndex];
            while (1) {
                newIndex = computeIndex(len, oldIndex, times);
                oldValue = arr[newIndex];
                arr[newIndex] = newValue;
    
                length--;
    
                if (newIndex == setIndex) { // if the set has ended (loop detected)
                    break;
                }
    
                tmp = newValue;
                newValue = oldValue;
                oldValue = tmp;
    
                oldIndex = newIndex;
            }
            setIndex++;
        }
    }
    

提交回复
热议问题