本专栏持续输出数据结构题目集,欢迎订阅。
文章目录
题目
给定顺序表 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;
}