我想要判断较短的数组是否是较长数组的前缀,我想要先输入数组元素,可是为什么两个while不能连着一起使用呢?
#include <iostream>
#include <vector>
using std::cin; using std::cout;
using std::endl; using std::vector;
int main()
{
vector<int> ivec1, ivec2;
int num;
cout << "Enter the first vector:";
while (cin >> num)
ivec1.push_back(num);
cout << "Enter the second vector:";
while (cin >> num)
ivec2.push_back(num);
int flag = 1;
for (int i = 0; i < (ivec1.size() <= ivec2.size() ? ivec1.size() : ivec2.size()); ++i)
if (ivec1[i] != ivec2[i]) {
flag = 0;
break;
}
if (flag)
cout << "YES\n";
else
cout << "NO\n";
return 0;
}
运行结果如下:
引用 皆我百晓生 小程序回复内容作答:
两个while循环不能连续使用,是因为cin会在遇到输入错误或者文件结尾时(例如输入结束符或者结束字符),将failbit置位,这会导致后续输入失败。在两个while循环连续使用时,第二个while循环会因为错误的输入状态而无法正常执行。为了解决这个问题,可以在第一个while循环后使用cin.clear()函数清除错误状态,并使用cin.ignore()函数忽略错误的输入,然后再进行第二个while循环的输入。修改后的代码如下:
#include <iostream>
#include <vector>
using std::cin; using std::cout;
using std::endl; using std::vector;
int main()
{
vector<int> ivec1, ivec2;
int num;
cout << "Enter the first vector:";
while (cin >> num) {
ivec1.push_back(num);
}
cin.clear();
cin.ignore(INT_MAX, '\n'); // 清除错误状态并忽略错误的输入
cout << "Enter the second vector:";
while (cin >> num) {
ivec2.push_back(num);
}
int flag = 1;
for (int i = 0; i < (ivec1.size() <= ivec2.size() ? ivec1.size() : ivec2.size()); ++i) {
if (ivec1[i] != ivec2[i]) {
flag = 0;
break;
}
}
if (flag) {
cout << "YES\n";
} else {
cout << "NO\n";
}
return 0;
}
这样修改后,就可以连续输入两个数组的元素。
【以下回答由 GPT 生成】
问题标题: 判断较短的数组是否是较长数组的前缀
问题标签: 数据结构
问题内容: 我想要判断较短的数组是否是较长数组的前缀,我想要先输入数组元素,但为什么两个 while 循环不能连着一起使用呢?以下是我的代码实现,请帮我优化一下:
#include <iostream>
#include <vector>
using std::cin; using std::cout;
using std::endl; using std::vector;
int main()
{
vector<int> ivec1, ivec2;
int num;
cout << "Enter the first vector:";
while (cin >> num)
ivec1.push_back(num);
cout << "Enter the second vector:";
while (cin >> num)
ivec2.push_back(num);
int flag = 1;
for (int i = 0; i < (ivec1.size() <= ivec2.size() ? ivec1.size() : ivec2.size()); ++i)
if (ivec1[i] != ivec2[i]) {
flag = 0;
break;
}
if (flag)
cout << "YES\n";
else
cout << "NO\n";
return 0;
}
运行结果如下:
请帮我优化一下以上代码。
首先,原代码并没有问题,而且是一个非常好的解决方案。不过,你提到想要优化代码,以下是一种可能的优化方式:
#include <iostream>
#include <vector>
using std::cin; using std::cout;
using std::endl; using std::vector;
bool isPrefix(vector<int>& ivec1, vector<int>& ivec2) {
size_t minSize = std::min(ivec1.size(), ivec2.size());
for (size_t i = 0; i < minSize; ++i) {
if (ivec1[i] != ivec2[i]) {
return false;
}
}
return true;
}
int main() {
vector<int> ivec1, ivec2;
int num;
cout << "Enter the first vector:";
while (cin >> num)
ivec1.push_back(num);
cout << "Enter the second vector:";
while (cin >> num)
ivec2.push_back(num);
if (isPrefix(ivec1, ivec2)) {
cout << "YES\n";
} else {
cout << "NO\n";
}
return 0;
}
这里我们将逻辑封装到了一个函数isPrefix
中。此函数接收两个vector参数,比较两个vector是否满足前缀关系。这样可以使代码更加模块化和可重用。
另外,在判断数组长度的时候,我们使用了std::min
函数来找到较小的长度,避免了使用复杂的三目运算符。
【相关推荐】