string---入门OJ题(1)

P5015 NOIP 2018 普及组 标题统计 - 洛谷

1.题目思路

本题就定义一个计数器然后便利一下字符串,注意字符串里可能含有空格,用cin的话只会读取到空格,它就会认为这是一个完整的字符串了,但我们需要读取整行,所以用getline。

代码实现

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s;
	getline(cin, s);
	int count = 0;
	for (int i = 0; i < s.size(); i++)
	{
		if (s[i] == ' ' || s[i] == '\n')
			continue;
		++count;
	}
	cout << count;
	return 0;
}

B2112 石头剪子布 - 洛谷

2.题目思路

就if-else每种情况比比大小,不能直接用字符串比较来做,默认是按字典序来比较,不准。写if-else的时候,除了s1==s2的情况,其余情况就只考虑Player1赢的情况,最后一个else就是Player2赢。

代码实现

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int n;

int main()
{
	cin >> n;
	while (n--)
	{
		string s1, s2;
		cin >> s1 >> s2;
		if (s1 == s2)
		{
			cout << "Tie" << endl;
		}
		else if (s1 == "Rock" && s2 == "Scissors")
		{
			cout << "Player1" << endl;
		}
		else if (s1 == "Scissors" && s2 == "Paper")
		{
			cout << "Player1" << endl;
		}
		else if (s1 == "Paper" && s2 == "Rock")
		{
			cout << "Player1" << endl;
		}
		else
		{
			cout << "Player2" << endl;
		}
	}

	return 0;
}

B2115 密码翻译 - 洛谷

3.题目思路

纯模拟。注意解密之后'a'->'z','A'->'Z'。注意不要直接写3个if,要用else if,不然比如说将si由a改成z之后,代码往后走又满足条件又进if里去多减了一次。

代码实现

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s;//直接原字符串上修改
	getline(cin, s);
	for (int i = 0; i < s.size(); i++)
	{
		if ((s[i] >= 'b' && s[i] <= 'z') || (s[i] >= 'B' && s[i] <= 'Z'))
			s[i] -= 1;
		else if (s[i] == 'a')
			s[i] = 'z';
		else if (s[i] == 'A')
			s[i] = 'Z';
	}
	cout << s;
	return 0;
}

P5734 【深基6.例6】文字处理软件 - 洛谷

4.题目思路

纯模拟。

代码实现

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int q;
string s;

int main()
{
	cin >> q >> s;
	while (q--)
	{
		int op = 0;
		cin >> op;
		if (op == 1)
		{
			string s_add;
			cin >> s_add;
			s += s_add;
			cout << s << endl;
		}
		else if (op == 2)
		{
			int a, b;
			cin >> a >> b;
			s = s.substr(a, b);//文中说的第几个字符就表示的下标
			cout << s << endl;
		}
		else if (op == 3)
		{
			int a;
			string tmp;
			cin >> a >> tmp;
			s = s.insert(a, tmp);
			cout << s << endl;
		}
		else
		{
			string sub;
			cin >> sub;
			size_t re = s.find(sub);
			if (re == string::npos)
				cout << -1 << endl;
			else
				cout << re << endl;
		}
	}
	return 0;
}

B2120 单词的长度 - 洛谷

5.题目思路

直接看代码就能看懂。

代码实现

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s;
	cin >> s;
	cout << s.size();
	//以单词为单位读
	while (cin >> s)
	{
		cout << ',' << s.size();
	}
	return 0;
}

B2122 单词翻转 - 洛谷

6.题目思路

认识一个库函数reverse。

代码实现

cpp 复制代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main()
{
	string s;
	while (cin >> s)
	{
		reverse(s.begin(), s.end());
		cout << s << endl;
	}
	return 0;
}

B2124 判断字符串是否为回文 - 洛谷

7.题目思路

直接看代码。

代码实现

cpp 复制代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

string s;

int main()
{
	cin >> s;
	int begin = 0;
	int end = s.size() - 1;
	while (begin <= end)
	{
		if (s[begin] == s[end])
		{
			++begin;
			--end;
		}
		else
		{
			cout << "no" << endl;
			break;
		}
	}
	if (begin > end)
		cout << "yes" << endl;
	return 0;
}

P1765 手机 - 洛谷

8.题目思路

首先本题需要用getline读取一整行字符串,因为字符串中包含空格。读取完成之后就便利字符串并且在便利的过程之中计算每一个字符要按多少下,最后累加在一起就是答案。怎么计算呢?每一个字符的按的次数都是固定的,我们可以将它们存起来,就很想算每个月的最大天数,每个月的最大天数也是固定的,除了润年要单独判断,其他的就都固定的,所以也是存进到了一个数组里,方便直接根据下标找到对应的值。

那怎么根据字母去计算到它对应的次数在哪个下标里存着呢?用ASCII码表就可以了,a的ASCII码为97,只要用si-97就能得到对应的下标。

代码实现

cpp 复制代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main()
{
	int cnts[26] = { 1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4 };
	string s;
	getline(cin, s);
	int cnt = 0;//总按键次数
	for (int i = 0; i < s.size(); i++)
	{
		//空格按一次,特判一下
		if (s[i] == ' ')
			++cnt;
		else//加else和不加else是两回事
			cnt += cnts[s[i] - 97];//s[i]-97就是对应下标
	}
	cout << cnt;
	return 0;
}

P1957 口算练习题 - 洛谷

9.题目思路

先按照字符串读入第一个字符串,判断一下是不是a/b/c,如果是说明当前这行有3个数据,如果不是,就说明当前这行有两个数据,执行的是上一次的计算。

代码实现

cpp 复制代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int i;

int main()
{
	cin >> i;
	string op;
	string last_op;
	while (i--)
	{
		cin >> op;
		//该行有3个数据
		if (op == "a" || op == "b" || op == "c")
		{
			string x, y, ans;
			cin >> x >> y;

			int l = stoi(x);
			int r = stoi(y);
			ans = x + y;

			if (op == "a")
			{
				printf("%d+%d=%d\n", l, r, r + l);
				ans += to_string(r + l);
				//+2是加的+和=
				cout << ans.size() + 2 << endl;
			}
			else if (op == "b")
			{
				printf("%d-%d=%d\n", l, r, l - r);
				ans += to_string(l - r);
				cout << ans.size() + 2 << endl;
			}
			else
			{
				printf("%d*%d=%d\n", l, r, l * r);
				ans += to_string(r * l);
				cout << ans.size() + 2 << endl;
			}
			last_op = op;//存一下这一次的运算符号
		}
		//该行有2个数据
		else
		{
			string y, ans;
			cin >> y;
			int l = stoi(op);
			int r = stoi(y);
			ans = op + y;
			if (last_op == "a")
			{
				printf("%d+%d=%d\n", l, r, r + l);
				ans += to_string(r + l);
				cout << ans.size() + 2 << endl;
			}
			else if (last_op == "b")
			{
				printf("%d-%d=%d\n", l, r, l - r);
				ans += to_string(l - r);
				cout << ans.size() + 2 << endl;
			}
			else
			{
				printf("%d*%d=%d\n", l, r, l * r);
				ans += to_string(r * l);
				cout << ans.size() + 2 << endl;
			}
		}
	}
	return 0;
}
相关推荐
qq_454245031 小时前
BasicMethod.Map 设计框架:8 个并行基础模块的数学根基与实现
数据结构·算法·c#
青山木1 小时前
Hot 100 --- 二叉树与递归
java·数据结构·算法·leetcode·深度优先
珠海西格电力2 小时前
数据采集与治理:零碳园区管理系统的 “生命线”
大数据·人工智能·算法·架构·能源
●VON3 小时前
HarmonyKit | 鸿蒙新特性:router 导航 API 从 pushUrl 到 UIContext 的演进
算法·华为·交互·harmonyos
星释3 小时前
鸿蒙智能体开发实战:31.鸿蒙壁纸大师 - 环境搭建与基础配置
算法·华为·ai·harmonyos·鸿蒙
ysa0510303 小时前
【板子】树上启发式合并
数据结构·c++·笔记·算法
学究天人3 小时前
数学公理体系大全:第一章 命题逻辑:真值之舞
人工智能·算法·机器学习·数学建模·动态规划·图论·抽象代数
小O的算法实验室3 小时前
2025年Neurocomputing,基于LLM的进化优化器:结合精英策略推理
算法
2301_800256114 小时前
数据结构基础期末复习例题
数据结构·算法