求助:实现不改变0位置的数组反转,现有C++代码存在问题
解决数组反转但保留0位置的问题
我们需要实现数组反转,但保持所有0的位置不变,仅反转非0元素的顺序。例如输入数组[0,5,7,8,0,9],输出应为[0,9,8,7,0,5]。
原代码的问题
原代码的核心错误在于for循环的自动增量逻辑:每次迭代时for会自动执行i++和j--,但遇到0时又额外执行i++或j--,导致指针移动过度,跳过了需要处理的元素。比如当arr[i]为0时,程序先执行i++再continue,此时for循环的增量部分又会让i再加1,相当于一次跳过两个位置,直接导致后续元素处理错位。
修正后的代码
#include<iostream> using namespace std; int main() { int arr[100], tot, i, j, temp; cout << "Enter the Size for Array: "; cin >> tot; cout << "Enter " << tot << " Array Elements: "; for(i = 0; i < tot; i++) cin >> arr[i]; cout << "\nThe Original Array is:\n"; for(i = 0; i < tot; i++) cout << arr[i] << " "; i = 0; j = tot - 1; while(i < j) { // 从左往右找第一个非0元素 while(i < j && arr[i] == 0) i++; // 从右往左找第一个非0元素 while(i < j && arr[j] == 0) j--; // 交换找到的一对非0元素 if(i < j) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; i++; j--; } } cout << "\n\nThe Reverse of Given Array is:\n"; for(i = 0; i < tot; i++) cout << arr[i] << " "; cout << endl; return 0; }
修正逻辑说明
- 改用
while循环手动控制指针i和j的移动,避免for循环自动增量带来的干扰。 - 内层两个
while循环分别从左右两侧定位到第一个非0元素,确保每次交换的都是需要反转的目标元素。 - 交换完成后手动移动指针,继续寻找下一对需要交换的元素,直到
i >= j时结束循环。
用示例[0,5,7,8,0,9]测试:
- 第一次找到左侧非0元素
5(i=1)和右侧非0元素9(j=5),交换后数组变为[0,9,7,8,0,5],指针移动为i=2、j=4。 - 第二次左侧找到
7(i=2),右侧因arr[4]是0,指针移动到j=3找到8,交换后数组变为[0,9,8,7,0,5],指针移动为i=3、j=2,循环结束,结果符合预期。
内容的提问来源于stack exchange,提问作者bhucho
相关产品推荐
相关产品推荐

