本專欄持續輸出數據結構題目集,歡迎訂閱。
文章目錄
- 題目
- 代碼
題目
給定順序表 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
代碼
#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;
}