目录
题目
思路
C语言代码
说明
C++代码
vector使用
什么是Vector?
Vector的基本使用
本题思路
Description
DarkDawn作为小学期的助教,工作之一便是统计讨论区同学们的发言情况。
DarkDawn是真的很严格,他认为一条发言不超过10个字符是没有营养的,同时如果一条发言在先前出现过一次,也是没有营养的发言。
DarkDawn很想立刻统计出结果,但他真的太累了,所以请你帮帮忙,帮他统计出结果。如果你帮他完成了任务,他就奖励你一个A C。
Input
第一行一个整数n(1 ≤ n ≤ 1000),表示发言条数
接下来有n行,每行一个字符串s(1 ≤ | s | ≤ 20),表示一条发言,发言仅由大小写字母组成且区分大小写
Output
一个整数,表示有营养的发言的条数。
本题思路很清晰。
首先记录n,依次遍历n条发言:
如果这条发言超过十个字符并且先前未出现过,该发言就是有营养的。
可以利用字符串动态数组来记录之前的发言。
下面我将给出C语言和C++的代码以及相关注意事项。
在 C 语言中,我们使用 scanf
函数来读取输入,使用 printf
函数来输出结果。为了存储字符串,我们使用了动态内存分配,使用字符指针数组 char** vec
来存储字符串的地址,并使用 malloc
和 free
来分配和释放内存。
在循环中,我们使用 strlen
函数来获取字符串的长度,使用 strcmp
函数来比较字符串是否相等。当字符串长度大于 10 且不在 vec
数组中时,我们将它复制到 vec
数组中,并增加 vecSize
的值。
最后,我们输出 vecSize
的值,并释放动态分配的内存。
#include
#include
#include
int main() {
int n;
scanf("%d", &n);
char** vec = (char**)malloc(n * sizeof(char*));//存储字符串的地址
int vecSize = 0;
for (int i = 0; i < n; i++) {
char str[100];
scanf("%s", str);
if (strlen(str) > 10) {
int found = 0;
for (int j = 0; j < vecSize; j++) {
if (strcmp(vec[j], str) == 0) {
found = 1;
break;
}
}
if (!found) {
vec[vecSize] = (char*)malloc((strlen(str) + 1) * sizeof(char));
strcpy(vec[vecSize], str);
vecSize++;
}
}
}
printf("%d\n", vecSize);
for (int i = 0; i < vecSize; i++) {
free(vec[i]);
}
free(vec);
return 0;
}
C++比C语言的代码简短很多。
#include
#include
#include
#include
using namespace std;
int main() {
int n;
cin >> n;
vector vec;
for (int i = 0; i < n; i++) {
string str;
cin >> str;
auto iter = find(vec.begin(), vec.end(), str);
if (str.size() > 10 && iter == vec.end()) vec.push_back(str);//str大于十个字符并且在数组中没有找到相同的字符串
}
cout << vec.size() << endl;
return 0;
}
vector是【C++】中一个多功能的,能够操作多种数据结构和算法的模板类和函数库。我们可以将它理解为一个能够存放任意类型的动态数组,能够增加和压缩数据。
Vector头文件:#include
声明一个vector容器:vector<数据类型> 名称;
添加元素到容器中:名称.push_back(元素);
判断某一元素是否存在于容器中:
vector<数据类型> :: iterator iter;
iter = find(容器名.begin(), 容器名.end(), 匹配元素);
if(iter != 容器名.end())
{
// 存在于容器中
}
vector<数据类型>::iterator
是用来声明一个迭代器的语法。它用于指向vector
容器中的元素,并且可以用来遍历容器中的元素。下面是一个示例代码,演示了如何声明一个
vector
迭代器iter
:#include
#include int main() { std::vector vec = {1, 2, 3, 4, 5}; // 声明一个 vector 迭代器 std::vector ::iterator iter; // 使用迭代器遍历 vector 容器中的元素 for (iter = vec.begin(); iter != vec.end(); ++iter) { std::cout << *iter << " "; } return 0; } 在上面的示例代码中,我们定义了一个整数类型的
vector
容器vec
,并且声明了一个vector
迭代器iter
。然后,我们使用for
循环和迭代器来遍历vec
容器中的元素,并将每个元素打印出来。注意,在 C++11 之后,可以使用
auto
关键字来自动推导迭代器类型,简化代码。示例如下:#include
#include int main() { std::vector vec = {1, 2, 3, 4, 5}; // 使用 auto 关键字自动推导迭代器类型 for (auto iter = vec.begin(); iter != vec.end(); ++iter) { std::cout << *iter << " "; } return 0; } 在上面的示例代码中,我们使用
auto
关键字来自动推导迭代器类型,无需显式声明迭代器类型。这样可以使代码更加简洁和易读。
获取容器中元素个数:名称.size();
借助vector的便利性,我们可以轻松实现本题功能。
在读入一个 String 后,我们可以先【查找】该字符串是否存在于vector容器中,如果【不存在】且【长度符合要求(使用String的size()方法)】时,我们将该字符串【添加(vector的push_back()方法)】到vector容器中。
在完成所有数据读入后,我们可以使用vector容器的size()方法来获取所有有效回答数量,输出即可。