zoukankan      html  css  js  c++  java
  • 循环移位

    今天面试,被考一道循环移位的算法问题:有一数组,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:

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

  • 相关阅读:
    Linux中find命令用法全汇总,看完就没有不会用的!
    ubuntu16.04 通过命令,修改屏幕分辨率
    Linux下如何查看哪些进程占用的CPU内存资源最多
    shell脚本 在后台执行de 命令 >> 文件 2>&1 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
    ef linq 访问视图返回结果重复
    asp.net core web 本地iis开发
    jQuery控制TR显示隐藏
    mvc EF 从数据库更新实体,添加视图实体时添加不上的问题
    无法确定依赖操作的有效顺序。由于外键约束、模型要求或存储生成的值,因此可能存在依赖关系
    还原差异备份——因为没有文件可用于前滚
  • 原文地址:https://www.cnblogs.com/woodzcl/p/8024891.html
Copyright © 2011-2022 走看看