有n个整数,使前面 各数顺序向后移m个位 置,移出的数再从开头 移入

/*有n个整数,使前面
各数顺序向后移m个位
置,移出的数再从开头
移入*/

/*
思路:
每次  先保存最后一个,再把前面n-1个从最后一个开始,赋值到下一个位置,
再把第一个位置赋值为(保存的最后一个)。
*/
#include <stdio.h>
#include <stdlib.h>
void sort(int p[],int n,int m)
{
    int i,j,number;
    for(i=1;i<=m;i++){
        number=p[n-1];
        for(j=n-2;j>=0;j--)
            p[j+1]=p[j];
        p[0]=number;

    }
}
int main()
{
    int *p;
    int n,m,i;
    printf("Give n and m:");
    scanf("%d%d",&n,&m);
    p=(int *)malloc(n*sizeof(int));
    for(i=0;i<=n-1;i++)
        scanf("%d",p+i);
    sort(p,n,m);
    printf("After sorted:");
    for(i=0;i<=n-1;i++)
        printf("%-4d",p[i]);
    return 0;
}

  • 10
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 假设有一个长度为n的整数数组a,要求将a中的元素都向后移动m个位动后,a的前m个元素会变为原来a的后n-m个元素,而a的后n-m个元素会变为原来a的前m个元素。可以通过以下步骤实现这一操作: 1. 创建一个长度为n的新数组b。 2. 将a的后n-m个元素复制到b的前m个位。 3. 将a的前m个元素复制到b的后n-m个位。 4. 将b赋值给a,完成数组元素的动操作。 可以用以下代码实现这一操作: ``` int n = a.length; int[] b = new int[n]; for (int i = 0; i < n; i++) { if (i < m) { b[i + n - m] = a[i]; } else { b[i - m] = a[i]; } } for (int i = 0; i < n; i++) { a[i] = b[i]; } ``` 这段代码假设m小于n,如果m大于等于n,则需要将m对n取模,以防止数组越界。 ### 回答2: 题目描述: 有n个整数,要求将这些数往后移动m个位,即整数i动到i+m位(若i+m>n,则将i+m-n转开头处)。要求时间复杂度为O(n),且只能使用常数级额外空间。 思路分析: 这道题可以采用循环位的思想进行求解。循环位即将一个数组或者字符串的元素向右循环动n个位。我们可以利用执行多次循环位操作,实现将前面各个数顺序后移m个位。 假设有以下数组: 1 2 3 4 5 6 将数组向后移动2个位,得到的新数组为: 5 6 1 2 3 4 我们可以发现,数组的后三个元素(4、5、6)被到了数组的前面,而其余的元素则被依次向后移动了2个位。这个过程中需要分别处理前三个元素和后三个元素。 处理前三个元素: 先将前三个元素反转。原数组为: 1 2 3 4 5 6 反转后数组变为: 3 2 1 4 5 6 处理后三个元素: 截取后三个元素并将其反转。原数组为: 1 2 3 4 5 6 截取后三个元素并反转后,数组变为: 1 2 3 6 5 4 最终,将前三个元素和后三个元素合并起来即可得到结果。即: 3 2 1 6 5 4 代码实现: 实现代码如下。其中nums为要动的数组,m为动的位数。由于题目中要求只能使用常数级额外空间,因此我们采用常数级别的空间交换元素。在循环位的过程中先将数组中的元素按照上述方法进行分组,分别处理每一组。最后将处理后的各组元素合并起来。 ```python def rotate(nums, m): n = len(nums) m = m % n # 反转数组中从0到n-m-1的元素 for i in range((n - m) // 2): nums[i], nums[n - m - i - 1] = nums[n - m - i - 1], nums[i] # 反转数组中从n-m到n-1的元素 for i in range(m // 2): nums[n - m + i], nums[n - 1 - i] = nums[n - 1 - i], nums[n - m + i] # 反转整个数组 nums.reverse() nums = [1, 2, 3, 4, 5, 6] m = 2 rotate(nums, m) print(nums) ``` ### 回答3: 这个问题可以用数组相关的技巧来解决。我们首先需要一个大小为n的整型数组a,表示这n个整数。接下来,我们定义一个大小为m的整型数组b,用于存放原数组a中最后m个数。然后,我们从后往前遍历数组a,将其后m个数动到数组b中。 接下来,我们次从后往前遍历数组a,将其前n-m个数向后移动m个位。这里我们需要倒序遍历数组a,以免后面的数覆盖前面的数。我们可以使用循环将数组a向后移动m个位:从a[n-1]开始,顺序将a[i-m]的值赋给a[i]。值得注意的是,在进行动时,需要保证动后原来的数组a中多的位(即前面的m个位)都被填充为0。 最后,我们将数组b中保存的最后m个数复制到数组a的前m个位,即可得到动m个位后的数组a。 例如,对于数组a=[1, 2, 3, 4, 5]和m=2,我们可以按照上述步骤来动数组,最终得到a=[0, 0, 1, 2, 3]。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值