编程题第二题:
最长和为零的子数组
Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description:
一个长度为N的数组中包含正数,负数,零, 请实现一个函数找出最长的和为零的连续子数组。
输入
所有数组元素在一行,元素之间以空格分隔
输出
所有数组元素在一行,元素之间以空格分隔
样例输入
1 2 3 4 -1 -2 -4 -3 1 2
样例输出
1 2 3 4 -1 -2 -4 -3
以下是本人编写的c++代码:
#include<stdio.h>
#include <iostream>
#include <vector>
using namespace std;
struct mys
{
vector<int> arr;
int cnt;
};
int main()
{
int cnt=0,i,j,k,n,sum=0,flag=0,Num=0;
vector<int>darr;
mys *g; //该指针没有使用
mys mystruct[2];
mystruct[0].cnt=mystruct[1].cnt=0;
cout<<mystruct[0].cnt<<" "<<mystruct[1].cnt<<endl;
cout<<mystruct[0].arr.size()<<" "<<mystruct[1].arr.size()<<endl;
while (cin>>n)
{
darr.push_back(n);
if (cin.peek() == '\n')
break;
}
Num=darr.size();
//cout<<Num;
for ( i=0; i<Num; i++ )
{
for ( j=i; j<Num; j++ )
{
sum +=darr[j];
if(flag==0) {
mystruct[0].cnt++;
mystruct[0].arr.push_back(darr[j]);
}
if (flag==1){
mystruct[1].cnt++;
mystruct[1].arr.push_back(darr[j]);
}
if (sum==0)
{
if (mystruct[0].cnt >= mystruct[1].cnt) {
g=&mystruct[0];
flag=1;
}
else
{
g=&mystruct[1];
flag=0;
}
continue;
}
}
sum=0;
if(flag==0) {
mystruct[0].arr.clear();
mystruct[0].cnt=0;
}
if(flag==1) {
mystruct[1].arr.clear();
mystruct[1].cnt=0;
}
}
//cout<<"原输入数据:";
vector<int>::iterator itor=darr.begin();
for (;itor !=darr.end();itor++)
{
cout<<*itor<<" ";
}
if (flag==1)
{
for ( i=0; i < mystruct[0].arr.size(); i++ )
cout<<mystruct[0].arr[i]<<" ";
}
else
{
for ( i=0; i < mystruct[1].arr.size(); i++ )
cout<<mystruct[1].arr[i]<<" ";
}
return 0;
}