我刚刚和朋友们沿着尝试了一些数据结构的问题,我从一个朋友那里遇到了这个问题,他也不能解决这个问题。
问题:反转数组而不改变零的位置。例如:如果数组具有057809,则结果应为098705。
我试过了,但它并不能在所有情况下都正确地做,我很抱歉,如果代码看起来很丑,我现在是一个新手。
#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]<<" ";
j = tot-1;
for(i=0; i<j; i++, j--)
{
if(arr[i] == 0) {
i++;
continue;
}else if(arr[j] == 0) {
j--;
continue;
}
else {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
cout<<"\n\nThe Reverse of Given Array is:\n";
for(i=0; i<tot; i++)
cout<<arr[i]<<" ";
cout<<endl;
return 0;
}
我已经尝试了上面的代码,但它没有给予出正确的结果。
6条答案
按热度按时间lqfhib0f1#
这里的问题是,在循环的每次迭代中都要修改循环变量
i
和j
;只有在元素被交换的情况下才需要更新它:www.example.com上的演示godbolt.org
mqkwyuun2#
看来你需要下一个循环逻辑:
imzjd6km3#
您可以使用两个指针进行切换,只需跳过任何0。
您可以在这里看到这一点:https://godbolt.org/z/84q3McccW
ryoqjall4#
在循环中的代码中:
当
arr[i]
是一个0
时,你递增i
,但是当你continue
时,在下一次迭代中,i
作为i++, j--
的一部分再次递增,这会使你的代码跳过元素,我建议使用std::vector
和迭代器:output:
代码从第一个元素和最后一个元素的迭代器开始,在循环中,当它们引用
0
并且两个元素还没有交叉时,它们会前进,然后交换元素。如果额外的内存是可以接受的,一个更简单的解决方案是将所有非零元素复制到第二个
std::vector
,std::reverse
向量,然后再复制回来。sr4lhrrt5#
如果没有要跳过的零,则代码可以是
现在,跳过零就足够了,这就给出了修改后的代码
注意,交换可以用i==j来执行,这是无用的,但无害的,因为0 ≤ i ≤ j〈n。
更新:正如@fabian所做的那样,您可以将三个循环压缩为一个循环。
ttp71kqs6#
你需要改变反转的逻辑。
我希望这能帮上忙