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] }
逻辑说明
- 内层循环先确保
i指向左边第一个非负数,j指向右边第一个非负数,且i < j - 只有当两者都找到有效非负数时,才执行交换操作
- 交换后移动指针,继续寻找下一对需要交换的非负数
这样就能保证负数的位置完全不变,仅反转所有正数的顺序。
内容的提问来源于stack exchange,提问作者Kalyan A
相关产品推荐
相关产品推荐

