【发布时间】:2020-12-21 06:07:20
【问题描述】:
我是 CPP 问题解决的初学者,但遇到了这个问题:- Q)给定一个未排序的非负整数数组,找到一个与给定数相加的连续子数组。 我正在用 gdb 调试它并且没有得到任何输出,它显示进程退出正常情况下是次等的 1。 关于为什么会发生的任何建议?
#include <stdio.h>
#include<iostream>
#include<vector>
using namespace std;
void subarray(vector<int> &a,int s,int n);
int main() {
int t,n,s,x;
cin>>t;
vector<int> v;
while(t)
{
cin>>n>>s;
for(int i=0;i<n;i++)
{
cin>>x;
v.push_back(x);
}
subarray(v,s,n);
t--;
v.clear();
}
return 0;
}
void subarray(vector<int> &a,int s,int n)
{
int j,sum,i=0;
while(j<n&&i<n)
{
sum+=a[j];
if(sum>s)
{
sum=sum-a[i];
i++;
j=i;
}
if(sum<s)
{
j++;
}
else
{
cout<<i+1<<" "<<j+1<<endl;
break;
}
if(j==n&&i<n)
{
i++;
j=i;
}
if(j==n&&i==n)
{
cout<<-1<<endl;
break;
}
}
}
【问题讨论】:
-
调试器找不到错误。它们可以帮助您找到错误。您要做的是使用调试器逐行执行程序,并查看程序的行为与您预期的偏差在哪里。意外几乎总是一个错误。
-
我猜这是因为您的子数组方法中有这一行
int j,sum,i=0;这意味着int j; int sum; int i=0;。在您尝试从具有错误索引sum+=a[j];的向量中获取值之后。我认为这不是你想要的。如果您想在一行中初始化多个变量,请像int a = 0, b = 0, c = 0, d = 0;或int a = 0, b = a, c = a, d = a;这样操作。 -
int j,sum,i=0;wherejin uninitialized 在第一次调用while(j<n&&i<n)和sum+=a[j];等时。请充分留出您的代码。理解while(j<n&&i<n)比while (j < n && i < n)更难读懂老眼睛。 (谢谢你的教授和老板)另外,继续前进,考虑Why is “using namespace std;” considered bad practice?