循环移位

今天面试,被考一道循环移位的算法问题:有一数组,N个元素,循环移动K个元素,要求算法时间复杂度为O(N)。

当时,还真被难住了。回来后,查查资料,才发现,这真是个操蛋的题啊。

特此记录下来,供有需要事使用

——————————————————————————————————————————————————-

#include <stdio.h>

#include <stdlib.h>

 

char arr[5] = {'0', '1', '2', '3', '4'};

 

void shift(int left, char* arr, int N, int K)

{

    K = K%N;

    int vbit = 0==left?N-K:K;

    int *sp = (int*)malloc(vbit*sizeof(char));

    int i = 0, s = 0;

    for(; i<vbit; i++)

    {

        sp[i] = arr[i];

    }

    for(; i<N; i++, s++)

    {

        arr[s] = arr[i];

    }

    for(i=0; s<N;i++,s++)

    {

        arr[s] = sp[i];

    }

 free(sp);

}

 

void reverse(char* arr, int start, int end)

{

    for(; start<end; start++,end--)

    {

        int s = arr[end];

        arr[end] = arr[start];

        arr[start] = s;

    }

}

 

void shift_effi(int left, char* arr, int N, int K)

{

    K = K%N;

    int vbit = 0==left?N-K:K;

    reverse(arr, 0, vbit-1);

    reverse(arr, vbit, N-1);

    reverse(arr, 0, N-1);

}

 

void main()

{

   

    printf("source: ");

    for(int i=0; i<5; i++)

    {

        printf("%c", arr[i]);

    }

 

    printf(" ");

 

    printf("left shift 2 unit ");

    shift(1, arr, 5, 2);

    for(int i=0; i<5; i++)

    {

        printf("%c", arr[i]);

    }

 

    printf(" ");

 

    printf("right shift 4 unit ");

    shift(0, arr, 5, 4);

    for(int i=0; i<5; i++)

    {

        printf("%c", arr[i]);

    }

    printf(" ");

 

    shift(0, arr, 5, 3);

    printf("source: ");

    for(int i=0; i<5; i++)

    {

        printf("%c", arr[i]);

    }

   

    printf(" ");

 

    printf("left shift 2 unit ");

    shift_effi(1, arr, 5, 2);

    for(int i=0; i<5; i++)

    {

        printf("%c", arr[i]);

    }

 

    printf(" ");

 

    printf("right shift 4 unit ");

    shift_effi(0, arr, 5, 4);

    for(int i=0; i<5; i++)

    {

        printf("%c", arr[i]);

    }

    printf(" ");

}

//result

# ./LeftRightShift
source:
01234
left shift 2 unit
23401
right shift 4 unit
34012
source:
01234
left shift 2 unit
23401
right shift 4 unit
34012

其中,shift_effi就是时间复杂度为N,空间复杂度为1的算法要求。

Finally:

作为工程师,被要求现场作法,有时候还真是头疼,毕竟,工程师还不等同于数学家。

原文地址:https://www.cnblogs.com/woodzcl/p/8024891.html