我写了一些代码,这些代码必须在名字列表中找到一对。
一对夫妻总是有相同的确切前缀,而男孩有后缀
"ka"
,而女孩的后缀为"ki"
。
例如:“ bipinka”和“ bipinki”是一对。
在问题中,给我们N
-名称的数量-后跟
下一行由用空格分隔的字符串列表组成。
我的逻辑是我将检查每个名称的最后两个字母。如果它是"ka"
,则在删除最后两个字母后将其添加到ka
向量中,对于"ki"
也是如此。然后,我简单地进行相等性检查,如果相等,则将它们从向量中删除,因为3个"bipinka"
不能共享1个"bipinki"
作为它们的队友。
我的代码如下:
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#define sd(n) scanf("%d", &n)
#define slld(n) scanf("%lld", &n)
#define slf(n) scanf("%lf", &n)
#define pd(n) printf("%d\n", n)
#define plld(n) printf("%lld\n", n)
#define plf(n) printf("%lf\n", n)
using namespace std;
int main() {
int N, i, j;
string names[1001];
vector<string> ka, ki;
sd(N);
for(i=0;i<N;i++)
{
cin >> names[i];
cout << names[i] << " "; //Entered this to check for error.
string lastTwo = names[i].substr(names[i].size()-2);
string name = names[i].substr(0, names[i].size()-2);
if (lastTwo == "ka")
{
ka.push_back(name);
}
else if (lastTwo == "ki")
{
ki.push_back(name);
}
}
int ctr = 0;
for(i=0; i<ka.size();i++)
{
for(j=0;j<ki.size(); j++)
{
if(ka[i] == ki[j])
{
ka.erase(ka.begin() + i - 1);
ki.erase(ki.begin() + j - 1);
ctr++;
}
}
}
cout << ctr<<endl;
return 0;
}
问题出在以下部分:
for(i=0;i<N;i++)
{
cin >> names[i];
cout << names[i]; //Entered this to check for error.
string lastTwo = names[i].substr(names[i].size()-2); //last two letters of name
string name = names[i].substr(0, names[i].size()-2); //name without last two letters
if (lastTwo == "ka")
{
ka.push_back(name); //Pushing in ka vector
}
else if (lastTwo == "ki")
{
ki.push_back(name); //Pushing in ki vector
}
}
如果输入为:
6
bipinki bipinka bipinka bipinka betiki betika
我的
cout
函数仅输出:bipinki bipinka bipinka bipinka betiki
然后代码遇到
Run Time Error - Out of Range.
。我正在使用在线IDE,所以这是我看到的错误:最佳答案
您的问题是在迭代时要从阵列中删除它。
由于您无法在此在线IDE上进行调试(我建议您下载VS Community 2015)。如果您有笔和纸,则记下这些值并进行迭代,然后在一半处擦除一个元素。
会发生什么?您的循环将超出范围。之所以会发生这种情况,是因为循环的范围是0 -> 5
,并且在循环期间,已从数组中删除了一个(或多个)元素。现在,您的数组为0 -> 4
,但是您的循环将趋于继续到达-> 5
。
运行时错误-超出范围。