如何通过移位实现数组元素置换并完成复原操作?
问题描述
用户提供的代码如下:
#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
相关产品推荐
相关产品推荐

