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

双指针技术问题:使用left<=right时程序出错,移除等号则正常

问题原因分析

你的代码在使用left<=right时出现错误,核心原因有两个:

1. 死循环

当left和right指向同一个元素(即left == right)时,代码进入abs(v[left])==abs(v[right])的分支,仅给v1[i]赋值,但没有移动left或right指针。此时循环条件left<=right仍然成立,循环会无限重复执行这个分支,导致程序死循环。

2. 数组越界

初始时v1的长度是6,下标范围为0~5。在死循环过程中,i会持续递增超过5,此时访问v1[i]会触发数组越界访问,这属于C++中的未定义行为,会导致程序崩溃或输出错误结果。

而将循环条件改为left<right时,当left和right指向同一元素时,循环直接终止,避免了死循环和越界问题。不过需要补充:此时最后一个元素(left==right指向的元素)并没有被处理,v1中对应位置会保留默认初始化值0,你需要在循环结束后手动添加对该元素的处理,比如:

if(left == right){
    v1[i] = v[left] * v[left];
}

再执行reverse操作,才能得到完整正确的平方排序数组。

内容的提问来源于stack exchange,提问作者Jeet Majumdar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:00:14