zoukankan      html  css  js  c++  java
  • PTA(BasicLevel)-1008数组元素循环右移问题

    一 、问题描述

          原题描述

       将长度为n的整形数组A进行右移m位操作, [A0 A1 A2 A3 ... Am...An-1]变为[An-m...An-1 A0 A1 A2 A3 ...An-m-1 ]

      输入格式:

      每个输入包含一个测试用例,第1行输入N(>0)和M(>=0);第2行输入N个整数,之间用空格分隔。

      输出格式:

      在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。


      输入样例:

      6 2   
      1 2 3 4 5 6

      输出样例:

      5 6 1 2 3 4

    二、解题思路

      比较常用的思路就是逆序打印再正序打印,和三次逆序翻转。

      显然翻转操作解题更符合题意,通过三次翻转操作,可得到右移的数组。首先对数组A整体进行翻转,然后再对A[0]到A[m-1]进行翻转,最后再对A[m]到A[n-1]这部分进行翻转操作,最后得到右移效果。

      下图为n= 10, m = 4的例子:

           

      解题代码如下:

    #include <stdio.h>
    
    void printMove( int A[], int arraySize )
    {
        int j;
        for ( j = 0; j < arraySize; j++ ) {
            printf("%d", A[j]);
            if ( j < (arraySize - 1) ) {
                printf(" ");
            }
        }
    }
    
    void move( int A[], int left, int right)
    {
        while ( left < right ) {
            int temp = A[left];
            A[left] = A[right];
            A[right] = temp;
    
            left++;
            right--;
        }
    }
    
    void move_A( int A[], int left, int right )
    {   // 从左到右进行元素交换
        int i, mid, tmp;
        
        mid = ( right - left + 1) / 2;
        for ( i = 0; i < mid; i++ ) {
            tmp = A[i + left];
            A[i + left] = A[right - i];
            A[right - i] = tmp; 
        }        
    }
    
    int main(int argc, char *argv[])
    {
        int i, j;
        int arraySize, moveStep;
        scanf("%d %d", &arraySize, &moveStep);
        
        int A[arraySize];
        for ( i = 0; i < arraySize; i++ ) {
            scanf("%d", &A[i]);
            //A[i] = i+1;
        } 
        
        /* three step */
        if ( moveStep > 0 ) {
            moveStep = moveStep % arraySize;
            move( A, 0, arraySize - 1 );
            //printMove( A, arraySize ); printf("
    ");        
            
            move( A, 0, moveStep - 1 );
            //printMove( A, arraySize ); printf("
    ");    
                
            move( A, moveStep, arraySize - 1 );
            printMove( A, arraySize ); //printf("
    ");        
        } else {
            printMove( A, arraySize ); //printf("
    ");        
        }
        
        return 0;
    }

      

      Python版本:

    nums = input() 
    L = nums.split(" ")
    A, B = int(L[0]), int(L[-1])
    B =  B % A
    
    numChars = input().split(" ") 
    Array = [ int(i) for i in numChars ] 
    
    if B > 0:
        Array = Array[::-1]
        leftA = Array[:B][::-1]
        rightA = Array[B:][::-1]
        Array = leftA + rightA
        
    length= len(Array)
    for i in range(length):
        print( Array[i],  end="")
        if i < (length - 1):
            print( " ",  end="")
        i =  i + 1
  • 相关阅读:
    Scrapy 概览笔记
    Python 依赖版本控制 (requirements.txt 文件生成和使用)
    Python 虚拟空间的使用
    macOS 所有版本 JDK 安装指南 (with Homebrew)
    鉴权那些事
    Java 位运算符和 int 类型的实现
    ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
    如何做好一次知识或技术分享
    ASP.NET Core 入门教程 4、ASP.NET Core MVC控制器入门
    ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门
  • 原文地址:https://www.cnblogs.com/justLittleStar/p/10686997.html
Copyright © 2011-2022 走看看