PTA(BasicLevel)-1008数组元素循环右移问题

Posted justlittlestar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
View Code

 

以上是关于PTA(BasicLevel)-1008数组元素循环右移问题的主要内容,如果未能解决你的问题,请参考以下文章

PTA(BasicLevel)-1009 说反话

PTA(BasicLevel)-1016 部分A+B

[code] PTA 胡凡算法笔记 DAY042

翻转数组/循环移动类题

[PTA][C语言][数据结构]队列的操作集合(带尾指针的循环链表)

数据结构PTA错题