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

求助:实现不改变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;
}

修正逻辑说明

  1. 改用while循环手动控制指针i和j的移动,避免for循环自动增量带来的干扰。
  2. 内层两个while循环分别从左右两侧定位到第一个非0元素,确保每次交换的都是需要反转的目标元素。
  3. 交换完成后手动移动指针,继续寻找下一对需要交换的元素,直到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:01:11