解题思路:
时间复杂度和空间复杂度降到最低,并且不需要任何的辅助空间。
使用双指针,进行数组元素原地后移
假设我们使用 1 2 3 4 5 6 7 8 9 10 作为测试数据,我们需要将其变成9 10 1 2 3 4 5 6 7 8
首先我们需要两个指针i和j
原始数据: 1 2 3 4 5 6 7 8 9 10 , 这个时候指针i指向0的位置,j指向n-m也就是8这个位置,接下来我们对前m个数和后m个数对应的一一交换,1和9交换,2和10交换。
第一次交换后:指针i指向了2这个位置,而j指向索引为10的地方,由于指针j超过了数组的索引范围,我们将其重置为n-m也就是8,数组变为 9 10 3 4 5 6 7 8 1 2
第二次交换后:指针i指向了4这个位置,而j指向索引为10的地方,由于指针j超过了数组的索引范围,我们将其重置为n-m也就是8,数组变为 9 10 1 2 5 6 7 8 3 4
第三次交换后:指针i指向了6这个位置,而j指向索引为10的地方,由于指针j超过了数组的索引范围,我们将其重置为n-m也就是8,数组变为 9 10 1 2 3 4 7 8 5 6
第四次交换后:指针i指向了8这个位置,而j指向索引为10的地方,由于指针j超过了数组的索引范围,我们将其重置为n-m也就是8,数组变为 9 10 1 2 3 4 5 6 7 8,这个时候由于 i==j 指针i与j相遇,退出循环,数组后移完成。
参考代码:
#include <stdio.h> #include <stdlib.h> #define SWAP(a, b)((a)^=(b),(b)^=(a),(a)^=(b)) #define mal(n, t)((t *) malloc(sizeof(t) * n)) int main() { // 输入 int n, m, *arr, i, j, k; scanf("%d", &n); arr = mal(n, int); for (i = 0; i < n; i++) { scanf("%d", &arr[i]); } scanf("%d", &m); // 数组原地后移 i = 0; j = n - m; while (i < j) { for (k = 0; k < m && i < j; k++) { SWAP(arr[i], arr[j]); i++; // i,j 指针后移 j++; if (j == n) { j = n - 1; } } } // 输出 for (i = 0; i < n; i++) { printf("%d ", arr[i]); } free(arr); return 0; }
0.0分
11 人评分
改成j=n-2; #include <stdio.h> #include <stdlib.h> #define SWAP(a, b)((a)^=(b),(b)^=(a),(a)^=(b)) #define mal(n, t)((t *) malloc(sizeof(t) * n)) int main() { // 输入 int n, m, *arr, i, j, k,x[10]={1,2,3,4,5,6,7,8,9,10}; // scanf("%d", &n); n=10; arr = mal(n, int); arr=x; // for (i = 0; i < n; i++) { // scanf("%d", &arr[i]); // } // scanf("%d", &m); m=2; // 数组原地后移 i = 0; j = n - m; while (i < j) { for (k = 0; k < m && i < j; k++) { SWAP(arr[i], arr[j]); i++; // i,j 指针后移 j++; if (j==
三部先先交换所有的数,然后交换前m个数,在交换后n-m个数就好了。
Noob 2022-03-18 16:55:50 |
嗯,这种方法简单一点,三次reverse即可
算法有问题 当例如n=10,m=7时是错的
简单的a+b (C语言代码)浏览:1103 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:681 |
三进制小数 (C语言代码)浏览:1017 |
2^k进制数 (C++代码)使用递归方法浏览:719 |
C语言训练-排序问题<1> (C++代码)浏览:589 |
P1002 (C语言代码)浏览:970 |
C语言训练-角谷猜想 (C语言代码)浏览:1705 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:889 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:519 |
1012题解浏览:859 |
keheia 2023-12-04 09:39:55 |
n) { j = n - 2; } } } // 输出 for (i = 0; i < n; i++) { printf("%d ", arr[i]); } free(arr); return 0; }