阅读程序 · 答案 5 4 10 1 6 22 -59 -6 -11 -6 · 考点:输入输出、位运算、分支结构、循环结构、一维数组
← 整套速查表 NOIP 普及组初赛 全部真题阅读程序写结果:
#include <iostream>
using namespace std;
void func(int ary[], int n )
{
int i=0, j, x;
j=n-1;
while(i<j)
{
while (i<j&&ary[i]>0) i++;
while (i<j&&ary[j]<0) j--;
if (i<j){
x=ary[i];
ary[i++]=ary[j];
ary[j--]=x;
}
}
}
int main()
{
int a[20], i, m;
m=10;
for(i=0; i<m; i++)
{
cin>>a[i];
}
func(a, m);
for (i=0; i<m; i++)
cout<<a[i]<<" ";
cout<< endl;
return 0;
}输入:5 4 -6 -11 6 -59 22 -6 1 10
看到双指针 i 找正数、j 找负数且中间有零时,先模拟 i 跳过正数、j 跳过负数,再判断是否交换。
易把 i 当成找负数、j 当成找正数,或忽略交换后指针自增导致越界判断错误。
考点:双指针重排数组
输入 10 个数,用双指针将正数移到前面、负数移到后面,中间若有零则留在中间。