【PTA数据结构 | C语言版】线性表循环右移

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

题目

给定顺序表 A=(a1​,a2​,⋯,an​),请设计一个时间和空间上尽可能高效的算法将该线性表循环右移指定的 m 位。例如,(1,2,5,7,3,4,6,8) 循环右移 3 位(m=3) 后的结果是 (4,6,8,1,2,5,7,3)。

输入格式:

第一行输入 n ( 1≤n≤105)、m(m≥0);第二行输入 n 个整数。所有数字在 int 型整数范围内,同行数字间以空格分隔。

输出格式:

输出循环右移 m 位以后的整数序列。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

6 2

1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

代码

c 复制代码
#include <stdio.h>

// 反转数组中从start到end的元素
void reverse(int arr[], int start, int end) {
    while (start < end) {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        start++;
        end--;
    }
}

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    
    // 定义数组并读取输入元素
    int arr[100000];
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    
    // 右移n次等于原数组 避免多余移动
    m = m % n;
    
    // 步骤1: 反转前n-m个元素
    reverse(arr, 0, n - m - 1);
    // 步骤2: 反转后m个元素
    reverse(arr, n - m, n - 1);
    // 步骤3: 反转整个数组完成循环右移
    reverse(arr, 0, n - 1);
    
    // 输出结果,确保行末无多余空格
    for (int i = 0; i < n; i++) {
        printf("%d", arr[i]);
        if (i < n - 1) {
            printf(" ");
        }
    }
    printf("\n");
    
    return 0;
}    
相关推荐
phltxy3 小时前
C语言操作符详解
java·c语言·算法
RuoZoe3 小时前
从 2026 年 3 月 1 日开源,到 26.10.9:Jalium UI 半年时间到底走了多远?
c语言·c++
aqiu1111113 小时前
【LeetCode 902】最大为 N 的数字组合 - 详细题解与数位组合思路
数据结构·算法·leetcode·蓝桥杯·数位dp
辰烨chenye4 小时前
LeetCode Hot 100 题解 · 哈希篇
算法·leetcode·哈希算法
罗西的思考4 小时前
DreamZero 与 DreamDojo:世界模型与策略的分层协同综合分析与对比
人工智能·算法·机器学习
玖玥拾5 小时前
LeetCode 219 存在重复元素 II
算法·leetcode·哈希算法·散列表
知无不研6 小时前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
a187927218317 小时前
【算法】动态规划第四篇:背包收官——min 哨兵、计数世界与组合排列分水岭
算法·leetcode·动态规划·dp·01背包·算法讲解·决策合并
HRTOS7 小时前
HRTOS 4.0 驱动库:06_Storage 存储设备驱动——24C02 EEPROM与I²C驱动开发
c语言·驱动开发·嵌入式硬件·51单片机