牛客竞赛每日俩题 - Day10

目录

输入输出的细节

函数find()的用法


输入输出的细节

收件人列表__牛客网

  • 细节一:当输入转行后又要使用getline()时,必须先使用getchar()吃掉前面的转行符'\n';
  • 细节二:用getline()输入带空格字符串;
  • 细节三:输出字符 ' " ' 时用cout << " \" "

补充:printf("%.2f%%\n", 100.0 * d[n] / f[n]); 打印百分号‘%’用%%

#include <iostream>
using namespace std;
#include <string>
int main()
{
	int n;
	while (cin >> n) {
		// 注意:接收完第一行的整数之后,必须要再接收下该行之后的空格,无法直接获取下一行
		getchar();
		string name;
		for (int i = 0; i < n; ++i)
		{
			// 接收一个用例,当找到','或者‘ ’时候补双引号
			// 否则:输出
			getline(cin, name);
			if (name.find(',') != string::npos || name.find(' ') != string::npos) {
				cout << "\"" << name << "\"";
			}
			else
			{
				cout << name;
			}
			// 注意:最后一个名字之后没有,
			if (i + 1 != n)
				cout << ", ";
		}
		cout << endl;
	}
	return 0;
}

函数find()的用法

抄送列表__牛客网

 函数find()

1、对string的查找

int main()
{
    string s="01234567";
    cout<<"字符串为:"<<s<<endl;
    int pos0=s.find('3');
    cout<<"查到的下标:"<<pos0<<endl;
    int pos1=s.find('a');
    cout<<"未查到返回:"<<pos1<<endl;
    return 0;
}

字符串为:01234567
查到的下标:3
未查到返回:-1

2、当pos为无符号整形size_t时

int main()
{
    string s = "01234567";
    cout << "字符串为:" << s << endl;
    size_t pos1 = s.find('a');
    cout << "未查到返回:" << pos1 << endl;
    if (pos1 == -1) cout << 666 << endl;
    return 0;
}

字符串为:01234567
未查到返回:4294967295
666

可见虽然是无符号导致值不为-1,但判断时会有整形提升导致依然可以判断成功

3、对于各种容器如果有s.find(容器内容) == s.end()则表示找不到

#include <iostream>
using namespace std;
#include <unordered_set>
#include <string>
int main()
{
	// 循环处理每一组测试用例
	string name;
	while (getline(cin, name))
	{
		// 将第一行中的所有名字进行拆解,保存在unordered_set中,方便后序查找
		unordered_set<string> s;
		size_t pos = 0;
		while (pos < name.size())
		{
			// 该名字使用""包含了,将该名字截取出来
				if (name[pos] == '\"')
				{
					size_t end = name.find("\"", pos + 1);
					s.insert(name.substr(pos + 1, end - pos - 1));
					pos = end + 2;//跳掉后面的双引号和逗号
				}
				else
				{
					// 该名字没有使用""包含,找到改名字的末尾后直接截取
					size_t end = name.find(",", pos + 1);
					if (end == -1)
					{
						// 已经是最后一个名字了
						s.insert(name.substr(pos, name.size() - pos));
						break;
					}
					s.insert(name.substr(pos, end - pos));
					pos = end + 1; //跳掉后面的逗号
				}
		}
		// 接收第二行的名字,然后检测其是否在unordered_set中存在
		getline(cin, name);
		if (s.find(name) == s.end())
		{
			printf("Important!\n"); //没找到
		}
		else
		{
			printf("Ignore\n"); //找到了
		}
	}
	return 0;
}

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄同学LL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值