Noob


私信TA

用户名:529013515

访问量:6809

签 名:

等  级
排  名 397
经  验 4882
参赛次数 0
文章发表 27
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:

时间复杂度和空间复杂度降到最低,并且不需要任何的辅助空间。

使用双指针,进行数组元素原地后移

假设我们使用 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 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答

代码解释器

  评论区

改成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==
2023-12-04 09:39:03
三部先先交换所有的数,然后交换前m个数,在交换后n-m个数就好了。
2021-11-06 11:30:51
算法有问题 当例如n=10,m=7时是错的
2021-09-25 16:01:50
  • «
  • 1
  • »