7-1 男孩和女孩
分数 300
全屏浏览
切换布局
作者 whl
单位 华北水利水电大学
最近这段时间有很多男孩子使用漂亮女孩子的头像在社交软件上聊天,这让聊天软件上的人区分屏幕对面的人的性别这件事变得很困难。
最近耗子哥在网上和一个使用美女头像的人聊的很开心,但是却不知道对面是男是女。耗子哥很害羞,他不敢问对方要照片或者打视频电话,他只能通过对方的网络昵称来判断对方是男是女,如果昵称中不同字符的数目是奇数,那么对方就是男性,否则是女性,如果对方是男性,那么将不符合耗子哥的心理预期,输出” IGNORE HIM!” ,让耗子哥忽略他,寻找下一个目标,否则输出” CHAT WITH HER!”
同时耗子哥会很高兴,我们希望耗子哥高兴,但是不希望你骗他,所以,如果欺骗耗子哥的感情是不能通过题目的。输入格式:
一串字符串,字符数目不超过100,代表与耗子哥聊天人的网络昵称,字符仅包含小写字母
输出格式:
如果对方是男生,输出IGNORE HIM!
如果对方是女生,输出CHAT WITH HER!输入样例:
abc
输出样例:
IGNORE HIM!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
我的答案:
C语言版本:
#include<stdio.h>
#include<string.h>//暴露了string的各个函数库不熟悉这个头文件究竟是干什么的
int main(){
char[100] a;//这是错的暴露了我对字符串数组的不足
for(int i=0;i<strlen(a),i++){//这里暴露了对字符串处理函数的不熟悉写出来也不知道对不对
for(int j=i+1;j<i;j++)
}
return 0;
}
C++版本:
#include<iostream>
using namespace std;
int main() {
int length;
bool sign;//第四个问题这里标志变量暴露了你知道说明时候该用什么时候不该用进而导致不知道怎么写这个循环
string id;//暴露了第一个问题就是string该怎么用
cin >> id;//暴露了第二个问题string定义后和数组是否一致
length = length.id;//好的暴露第三个问题就是我不记得如何在C++里求string的长度了
for (int i = 0; i < length; i++) {
sign = true;//第五个问题就是sign放哪里了,这个跟作用域有关,仔细看看我的C++水平是千疮百孔
for (int j = i + 1; j << length; j++) {
if(id)//第二个问题直接导致我不会写这里了
}
}
}
正确答案:
两种写法:
法一:双层循环遍历
第一种忘记了STL中的set集合的可以用for双重循环遍历,这个就考验选手对字符串的掌握程度了。
这里提供两个版本C语言和C++;
C语言:
#include <stdio.h>
#include <string.h> // 用于strlen
int main() {
char nickname[101]; // 字符数组,多一个位置用于存储末尾的null字符
scanf("%s", nickname);
int length = strlen(nickname); // 获取字符串的实际长度
int uniqueCount = 0; // 不同字符的数量
for (int i = 0; i < length; ++i) {
int isUnique = 1; // 假设当前字符是唯一的
for (int j = 0; j < i; ++j) {
if (nickname[i] == nickname[j]) {
isUnique = 0; // 发现重复字符
break; // 跳出内循环
}
}
if (isUnique) {
++uniqueCount; // 当前字符是唯一的,计数加一
}
}
if (uniqueCount % 2 == 0) {
printf("CHAT WITH HER!\n");
} else {
printf("IGNORE HIM!\n");
}
return 0;
}
C++版本:
#include <iostream>
using namespace std;
int main() {
string nickname;
cin >> nickname;
int length = nickname.length();
int uniqueCount = 0; // 不同字符的数量
for (int i = 0; i < length; ++i) {
bool isUnique = true;
for (int j = 0; j < i; ++j) {
if (nickname[i] == nickname[j]) {
isUnique = false;
break; // 如果找到相同的字符,就跳出内循环
}
}
if (isUnique) {
++uniqueCount; // 如果当前字符是唯一的,增加计数
}
}
if (uniqueCount % 2 == 0) {
cout << "CHAT WITH HER!" << endl;
} else {
cout << "IGNORE HIM!" << endl;
}
return 0;
}
法二:set集合去重
C++版本:
一、信息
- 输入是一个字符串,代表网络昵称,长度不超过100个字符,且仅包含小写字母。
- 根据昵称中不同字符的数量判断性别:奇数为男性,偶数为女性。
- 输出:“IGNORE HIM!” 如果是男性,或者“CHAT WITH HER!” 如果是女性。
二、分析
- 信息的作用: 输入的字符串用来确定字符的种类数目,这个数目的奇偶性用来判断性别。
- 思考过程和分析过程:
- 我们需要统计字符串中不同字符的数量。这可以通过遍历字符串,使用一个数据结构(如集合)来存储遇到的字符实现。
- 字符串遍历完成后,检查集合的大小。如果大小是奇数,则昵称对应的是男性;如果是偶数,则对应的是女性。
- 题目样例分析:
- 输入"abc"含有3个不同的字符('a', 'b', 'c'),数量为奇数,所以输出应为"IGNORE HIM!"。
三、算法设计
- 初始化一个空集合
unique_chars
。 - 遍历输入的字符串,将每个字符加入到
unique_chars
集合中。 - 判断
unique_chars
的大小:- 如果是奇数,则输出“IGNORE HIM!”。
- 如果是偶数,则输出“CHAT WITH HER!”。
四、代码实现
#include <iostream>
#include <set>
using namespace std;
int main() {
string nickname;
cin >> nickname;
// 使用set来存储昵称中的每个不同字符,因为set自动去重
set<char> uniqueChars(nickname.begin(), nickname.end());
// 根据唯一字符的数量判断并输出结果
if (uniqueChars.size() % 2 == 0) {
cout << "CHAT WITH HER!" << endl;
} else {
cout << "IGNORE HIM!" << endl;
}
return 0;
}
五、实现代码过程中可能遇到的问题
- 遗忘包含头文件:忘记包含
<set>
或<iostream>
可能导致编译错误。 - 边界条件处理:虽然题目简单,但是仍需注意
unique_chars.size()
的正确使用。 - 效率问题:对于本题而言,由于字符串长度限制在100以内,使用集合来存储字符并不会导致效率问题。但是在处理更大数据时,需要考虑数据结构的选择是否最优。