题目练习1

文章提供了三个C++编程题目,涉及字符串操作。第一个题目通过哈希表删除公共字符,第二个题目通过排序求解团队竞赛的最大水平值总和,第三个题目用reverse函数实现单词逆置而不影响标点符号。
摘要由CSDN通过智能技术生成

1.删除公共字符

题目描述:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
思路:使用哈希表进行将在每个字符的位置上进行标记,先将要删除的字母标记成1,在遍历每个字符,将是0的字符放在另一个字符串里,最后将新的字符串输出。
特殊之处:代码中使用了string类中的getline函数对字符串自动提取,其中的cin遇到空格就结束,保证了输入的字符串是一行。

#include<iostream>
using namespace std;
#include<string>

int main()
{
	string str1, str2;
	getline(cin,str1);
	getline(cin, str2);//cin遇到空格就结束

	int hash[128] = { 0 };//定义一个哈希表 128位
	for (int i = 0; i < str2.size(); i++)
	{
		hash[str2[i]]++;
	}
	string ret;
	for (int j = 0; j < str1.size(); j++)
	{
		
		if (hash[str1[j]] == 0)
		{
			ret = ret + str1[j];
		}
	}
	cout << ret << endl;
	return 0;
}

运行结果展示:
输入:They are student.
aeiou
输出: Thy r stdnts
在这里插入图片描述

2.组队竞赛

题目描述:牛牛举办了一次编程比赛,参加比赛的有3n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。
例如:
一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2
为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。
如样例所示:
如果牛牛把6个队员划分到两个队伍
如果方案为:
team1:{1,2,5}, team2:{5,5,8}, 这时候水平值总和为7.
而如果方案为:
team1:{2,5,8}, team2:{1,5,5}, 这时候水平值总和为10.
没有比总和为10更大的方案,所以输出10.

思路:使用sort函数先将数组中的数字进行排序,有题目可知道,想要求出平均值,不会是最大的数,而是次大的数,与之相隔的数字,所以先遍历找到这些数字之后在相加。
注意:代码中使用了vector类中的reserve函数
reserve():可以帮助我们有效地提升容器中插入新数据的效率,减少内存重新分配。
sort():用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>

int main()
{
	int n ;
	cin >> n;
	long long sum = 0;
	vector<int> arr;
	arr.reserve(3*n);
	for (int i = 0; i < 3 * n; i++)
	{
		cin >> arr[i];
	}
	sort(arr.begin(), arr.end());
	for (int j = 0; j < n; j++)
	{
		sum = sum + arr[arr.size() - 2 * (j + 1)];
	}
	cout << sum << endl;
	return 0;
}

3.字符串逆置

题目描述:将一句话的单词进行倒置,标点不倒置。比如 “I like beijing.”,经过处理后变为:“beijing. like I”。字符串长度不超过100。
思路:使用reverse函数将整体进行逆置,在进行每个单词局部逆置
注意:一定要判断出逆置的数组下标位置

#include<iostream>
using namespace std;
#include<string>
#include<algorithm>
int main()
{
	string str;
	getline(cin,str);
	reverse(str.begin(), str.end());//先整体逆转
	for (size_t i = 0; i < str.size(); ++i)
	{
		int tmp = i;
		while (str[i] != ' ' && i < str.size())
		{
			++i;
		}
		reverse(str.begin() + tmp, str.begin() + i);//倒置每一个单词
	}
	cout << str << endl;
}

运行结果展示:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值