提问人:Jeet Majumdar 提问时间:8/18/2023 最后编辑:Vlad from MoscowJeet Majumdar 更新时间:8/18/2023 访问量:44
两个指针错误:每当我使用 while(left<=right) 时,它都会出现错误,但是当我删除等号时,它可以正常工作
two pointer error: whenever i use while(left<=right) it gives an error, but when i remove the equal sign it works fine
问:
vector<int> v{-10,-7,-3,2,5,6}, v1(6);
int left = 0;
int right = 5;
int i=0;
while (left<=right){
if (abs(v[left])>abs(v[right])){
v1[i]=v[left]*v[left];
left++;
}
else if (abs(v[left])<abs(v[right])){
v1[i]=v[right]*v[right];
right--;
}
else if (abs(v[left])==abs(v[right])){
v1[i]=v[right]*v[right];
}
i++;
}
reverse(v1.begin(), v1.end());
for (int ele:v1)
{
cout<<ele<<" ";
}
每当我使用 (left<=right) 时,它都会出现错误,但是当我删除等号时,它工作正常
答:
0赞
Vlad from Moscow
8/18/2023
#1
由于这个 else 语句
else if (abs(v[left])==abs(v[right])){
v1[i]=v[right]*v[right];
}
当等于 时,您可以获得无限循环,因为两者都没有更改。另一方面,变量递增left
right
left
right
i
i++;
因此,将访问向量之外的内存。v1
0赞
Misha T
8/18/2023
#2
如果你的周期变得无休止。并且你每次都会递增,所以你会调用 ,其中 5 以上,并收到 SEGFAULTleft == right
i
v1[i]=v[right]*v[right];
i
评论
while (left<=right)
运行 7 次(崩溃前),因此最后一次访问越界。 运行 6 次,因此没有这个问题。v[i]
while (left<right)
if (i > 5) throw "oops";