• 1008. 数组元素循环右移问题 (20)


    一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

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

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

    输入样例:

    6 2
    1 2 3 4 5 6
    

    输出样例:

    5 6 1 2 3 4

    思路:题目明确规定了,不能开辟新数组并且要使其实现所需的步骤最少;首先创建一个swap函数用以交换两个变量;然后使用翻转思想即可实现数组的循环右移(见注释)

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<math.h>
     4 
     5 void swapNum(int* a, int* b)
     6 {
     7     *a = *a ^ *b;
     8     *b = *a ^ *b;
     9     *a = *a ^ *b;
    10 }
    11 
    12 int main()
    13 {
    14     int N,M,M1;
    15     scanf("%d%d",&N,&M1);
    16     int arr[N];
    17     M = M1%N;//此处是一个小坑,由于M并无上界,要考虑到其超出N的情形 
    18     for(int i=0; i<N; i++)
    19     {
    20         scanf("%d",&arr[i]);
    21     }
    22     //1.第一次reverse
    23     for(int i=N-1, j=0; i>j; i--,j++)
    24     {
    25         swapNum(&arr[i], &arr[j]);
    26     }
    27     //2.第二次reverse
    28     for(int i=M-1,j=0; i>j; i--,j++)
    29     {
    30         swapNum(&arr[i],&arr[j]);        
    31     } 
    32     //3.第三次reverse
    33     for(int i=N-1,j=M; i>j; i--,j++)
    34     {
    35         swapNum(&arr[i],&arr[j]);    
    36     } 
    37     //4.输出
    38     for(int i=0; i<N; i++)
    39     {
    40         if(i!=N-1)    
    41             printf("%d ",arr[i]);
    42         else 
    43             printf("%d",arr[i]);
    44     }
    45     return 0;
    46 }
  • 相关阅读:
    mybatis SQL 根据in条件语句排序
    Redis面试总结
    数据库优化之分库分表
    jdk1.6 Synchronized 优化总结
    CounDownLatch、CyclicBarrier、Semaphore
    java锁总结
    Redis 与 MySQL 双写一致性如何保证
    dubbo总结
    一、全国大学生电子设计竞赛测控(无人机)方向___基础篇
    编解码KL变换详解和哥伦布k阶编解码
  • 原文地址:https://www.cnblogs.com/valar/p/6151804.html
Copyright © 2020-2023  润新知