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

Go语言实现不改变负数位置的数组反转:代码问题求助

数组反转但保留负数位置的修正方案

你的代码问题在于没有确保找到一对非负数后再执行交换,指针移动逻辑混乱,导致负数被错误交换到正数位置。

问题分析

原代码中,只要遇到负数就移动指针,但之后不管当前i和j是否指向正数,直接执行交换操作——比如当j还停在负数位置时,会把负数和左边的正数交换,破坏负数的位置。同时交换后强制移动指针,跳过了后续需要检查的元素。

修正后的代码

package main
import "fmt"

func swapContents1(listObj []int) {
    i, j := 0, len(listObj)-1
    for i < j {
        // 从左往右找第一个非负数
        for i < j && listObj[i] < 0 {
            i++
        }
        // 从右往左找第一个非负数
        for i < j && listObj[j] < 0 {
            j--
        }
        // 找到有效对后交换
        if i < j {
            listObj[i], listObj[j] = listObj[j], listObj[i]
            i++
            j--
        }
    }
}

func main() {
    listObj := []int{1, 2, 3, -4, 5, -6, -7}
    swapContents1(listObj)
    fmt.Println(listObj) // 输出: [5 3 2 -4 1 -6 -7]
}

逻辑说明

  1. 内层循环先确保i指向左边第一个非负数,j指向右边第一个非负数,且i < j
  2. 只有当两者都找到有效非负数时,才执行交换操作
  3. 交换后移动指针,继续寻找下一对需要交换的非负数

这样就能保证负数的位置完全不变,仅反转所有正数的顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:38:24