zoukankan      html  css  js  c++  java
  • 数组元素循环右移问题

    题目内容:  

      题目链接

      

    解题思路

      方法一:

      这是我自己摸索出来的一种方法,通过对数组的多次逆置来达到循环的效果,一共对数组进行了三次逆置,所以就需要构造一个函数,

      这个函数既可以逆置一个数组,也可以逆置数组的部分区间。

      1,先将整个数组[0,N)逆置一遍;

      2,将数组的前部分区间[0,M)进行逆置;

      3,将数组的后部分区间[M,N)进行逆置;

      假设N=2,M=2,具体数组为nums[6]={1,2,3,4,5,6};则逆置过程如下图所示:

      

      代码如下:

    #include<stdio.h>
    void printArray(int nums[],int len);
    void reverseArrayPro(int nums[],int begin,int end);
    int main()
    {
        int len,move;
        int i = 0;
        scanf("%d%d",&len,&move);
        int nums[len];
        for(i = 0;i < len;i++){
            scanf("%d",&nums[i]);
        }
        move = move%len;
        reverseArrayPro(nums,0,len);
        reverseArrayPro(nums,0,move);
        reverseArrayPro(nums,move,len);
        printArray(nums,len);
        return 0;
    }
    //数组打印
    void printArray(int nums[],int len){
        int i=0;
        for(i = 0; i < len; i++){
            if(i==len-1)
                printf("%d",nums[i]);
            else
                printf("%d ",nums[i]);
            
        }
    }
    //改进版数组就地逆置
    void reverseArrayPro(int nums[],int begin,int end){
        int i=0;
        int j=1;
        for(i=begin;i<(end-begin)/2+begin;i++){
                int temp = nums[i];
                nums[i]=nums[end-j];
                nums[end-j]=temp;  
                j++;
        }
    }

      

       

       方法二:

      这是我在网上看的一种方法,这种方法相对于我的方法来说简单许多,但是实际上它没有移动数组中的元素,而只是简单地改变了一下数组中元素的遍历

      顺序,先遍历出数组中 N-M ~ N-1号元素,再遍历出0~N-M-1号元素。

       

      代码如下:

    #include<stdio.h>
    int main()
    {
        int len,move;
        int i = 0;
        scanf("%d%d",&len,&move);
        int nums[len];
        for(i = 0;i < len;i++){
            scanf("%d",&nums[i]);
        }
        move = move%len;
        for(i = len-move;i<len;i++){
            printf("%d ",nums[i]);
        }
        for(i = 0;i<len-move;i++){
            if(i==len-move-1)
                printf("%d",nums[i]);
            else
                printf("%d ",nums[i]);
            
        }
        return 0;
    }

  • 相关阅读:
    sql server 2008数据复制方法
    排错技能:任务管理器中追踪某w3wp.exe是哪个IIS站点的application pool
    SplendidCRM中给来自EditView中的listbox控件设置选中值或数据源
    jQuery String Functions
    [转]jquery getJSON 数据联动(采用序列化和反序列化获取数据) .
    [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
    深入理解C语言
    Qt回忆录之配置开发环境
    360电话面试
    浅谈C++设计模式之单例模式
  • 原文地址:https://www.cnblogs.com/TomHe789/p/12390412.html
Copyright © 2011-2022 走看看