zoukankan      html  css  js  c++  java
  • O(n)时间解决的面试题:循环移位

    问题描述

       

    一个数组或者一个字符串,比如12345循环移动一位就是23451,再循环移动一位就是34512,问循环移动m位之后,数组或者字符串变成什么样

       

    分析问题

       

    首先我们需要弄明白一个问题,那就是循环移动m位和循环移动m%n位是一样的

       

    我们可以不断地循环移动,每次将数组中的元素右移一位,循环m%n次,那么时间复杂度为n^2

       

    RightShift(int* arr,int N,int m){

    while(m--){

    int t=arr[N-1];

    for(int i=N-1;i>0;i--){

    arr[i]=arr[i-1];

    }

    arr[0]=t;

    }

    }

       

    另外还有一种线性的算法,该算法的策略师先翻转前m位,然后翻转后n-m位,最后将所有的都翻转一下

       

    算法实现

       

    Reverse(int* arr,int b,int e){

    for(;b<e;b++,e--){

    int temp=arr[e];

    arr[e]=arr[b];

    arr[b]=temp;

    }

    }

    ReverseShift(int* arr,int N,int m){

    m%=N;

    Reverse(arr,0,N-k-1);

    Reverse(arr,N-k,N-1);

    Reverse(arr,0,N-1);

    }

  • 相关阅读:
    spring给容器中注入组件的几种方式
    Linux多进程
    Linux多进程的应用
    Linux进程通信
    Linux信号
    Linux共享内存
    Linux信号量
    Linux多线程
    Linux线程同步
    Linux调用可执行程序
  • 原文地址:https://www.cnblogs.com/keedor/p/4529054.html
Copyright © 2011-2022 走看看