You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过移位实现数组元素置换并完成复原操作?

问题描述

用户提供的代码如下:

#include <iostream>
using namespace std;

void permute(int arr[],int len){
    //if(len==1) cout << arr[fixed];
    for(int i=0; i<len; i++){
        cout << arr[i] << " ";
        if(len==0) return;
        for(int j=i; j<len-1; j++){
            arr[j] = arr[j+1];
        }
        permute(arr, len-1);
        cout << endl;
    }
}

int main(){
    int n = 3;
    int arr[n];
    for(int i=0; i<n; i++) cin >> arr[i];
    permute(arr, n);
}

用户需求:
我了解用于置换数组元素的swap方法,现尝试实现一种方案:先打印当前获取到的元素,再将该元素之后的所有元素向前移位一位。但这种操作会修改整个原数组,请问如何在完成一次迭代后恢复之前的数组状态,就像swap方法中通过反交换操作复原数组那样?

解决方案

要恢复数组状态,你可以在移位操作前保存被覆盖的元素,递归完成后再将元素插回原位置,具体修改如下:

#include <iostream>
using namespace std;

void permute(int arr[], int len) {
    if (len == 0) return;
    for (int i = 0; i < len; i++) {
        cout << arr[i] << " ";
        // 保存当前要移除的元素,避免移位后丢失
        int temp = arr[i];
        // 将i之后的元素向前移位
        for (int j = i; j < len - 1; j++) {
            arr[j] = arr[j + 1];
        }
        // 递归处理剩余元素
        permute(arr, len - 1);
        cout << endl;
        // 从后往前将元素后移,为恢复原元素腾出位置
        for (int j = len - 2; j >= i; j--) {
            arr[j + 1] = arr[j];
        }
        // 将保存的元素放回原位置,还原数组
        arr[i] = temp;
    }
}

int main() {
    int n = 3;
    int arr[n];
    for (int i = 0; i < n; i++) cin >> arr[i];
    permute(arr, n);
    return 0;
}

关键说明:

  • 保存元素:移位前用temp存储arr[i],防止移位操作覆盖该元素导致丢失
  • 恢复数组:递归返回后,从len-2倒序遍历到i,将元素依次后移一位,最后把temp放回arr[i],完全还原移位前的数组状态,确保下一次循环能处理原始数组的元素

内容的提问来源于stack exchange,提问作者KeShAw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:59:55