C++每日一练——组队竞赛&&两数相加

🍎组队竞赛

🍉题目要求

每组有3个队员,在3*n个选手,n组队伍中找到每组队伍的水平值(队员中第二高的水平值),然后求出所有队伍水平值总和的最大值在这里插入图片描述
第一行输入:队伍的个数n
第二行输入:3 * n个选手的水平值
输出:水平值总和可能超过int所以设为long
在这里插入图片描述

🍉思路分析

要求水平值总和的最大值,只需要保证每支队伍的水平值最大,那么和就最大。

如何使每支队伍的水平值最大呢?

先对3 * n个选手排升序,然后从大到小找到每支队伍最大的水平值相加,得到想要的输出结果,从3*n-2开始每隔一个数就是每组的最大水平值

在这里插入图片描述

🍉C++代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int main()
{	
	//n是队伍个数,tmp是每个队员的水平值
	int n, tmp;
	//循环输入
	while (cin >> n)
	{
		vector<int> v;
		//开3*n个空间
		v.resize(3 * n);
		for (int i = 0; i < 3 * n; i++)
		{
			cin >> tmp;
			//将3*n个数尾插到vector中
			v[i] = tmp;
		}
		//迭代器区间对vector排序
		sort(v.begin(), v.end());
		long sum = 0;
		for (int i = 3 * n - 2; n > 0; i -= 2, --n)
		{
			sum += v[i];
		}
		cout << sum << endl;
	}
	
	return 0;
}

结果测试和上面的两个用例吻合
在这里插入图片描述

🍎删除公共字符串

🍉题目要求

在字符串1中删除在字符串2中出现的所有字符在这里插入图片描述
在这里插入图片描述

🍉思路分析

我们可以定义一个数组,在数组中标记字符串2中出现过的所有字符,实现数组与字符串2之间的映射,然后在依次判断字符串1的字符是否出现在数组中,最后得到新的字符

在这里插入图片描述

🍉C++代码

#include <iostream>
#include <string>

using namespace std;

int arr[255] = { 0 };

int main()
{	
	//s1,s2为输入的两个字符对象,s3为输出的字符对象
	string s1, s2, s3;
	getline(cin, s1);
	getline(cin, s2);
	//记录s2中出现的所有字符
	for (size_t i = 0; i < s2.size(); i++)
	{
		arr[s2[i]] = 1;
	}
	//将s1中没有在s2中出现过的字符尾插到s3中
	for (size_t i = 0; i < s1.size(); i++)
	{
		if (arr[s1[i]] != 1)
			s3 += s1[i];
	}
	cout << s3 << endl;

	return 0;
}

测试结果吻合
在这里插入图片描述

🍑链表的两数相加

LeetCode第二题

链表是逆序的,从头节点到尾节点依次是个位,十位,百位…,而我们要的就是从个位开始加逐步加到最高位。
在这里插入图片描述
所以只需要依次取两个链表对应的个位,十位,百位…相加,然后尾插到新的链表中中即可,在这过程中需要考虑进位与两个链表的节点个数在这里插入图片描述

题目已经给出了节点的构造函数
在这里插入图片描述

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* begin1 = l1, *begin2 = l2;
        //头尾指针
        ListNode* head = nullptr, *tail = nullptr;
        //next为进位,sum为两个位数的和
        int next = 0, sum = 0;
        int val1 = 0, val2 = 0;
        //通过begin1和begin2分别遍历两个链表
        //只有都走到nullptr循环才终止
        while (begin1 || begin2)
        {	
        	//val1和val2分别表示两个链表的节点的val,都初始化为0
            val1 = val2 = 0;
            //只有不为空才取节点的val
            if (begin1 != nullptr)
            {
                val1 = begin1->val;
                begin1 = begin1->next;
            }
            if (begin2 != nullptr)
            {
                val2 = begin2->val;
                begin2 = begin2->next;
            }
            //将两个val和进位相加
            sum = val1 + val2 + next;
            //进位
            if (sum > 9)
            {
                sum -= 10;
                next = 1;
            }
            else
                next = 0;
            
            if (head == nullptr)
            {
                head = tail = new ListNode(sum);
            }
            else
            {
                tail->next = new ListNode(sum);
                tail = tail->next;
            }
        }
        //最后判断是否需要进位,比如9+1,循环结束后需要把进位加上
        if (next == 1)
        {
            tail->next = new ListNode(1);
            tail = tail->next;
        }
        return head;
    }
};

🍑字符串相加

Leetc第415题

字符串的两数相加很有意义可以处理大数之间的求和,不存在溢出的情况。
和上面链表的两数相加类似,不过这里我们需要将从尾开始相加,然后将个位数、十位数…依次尾插到新的string中,然后需要逆序string在这里插入图片描述

class Solution {
public:
    string addStrings(string num1, string num2) {
    	//restr用来存放和
        string retstr;
        //从字符串的最后一个有效字符相加,也就是个位数
        int end1 = num1.size() - 1, end2 = num2.size() - 1;
        int next = 0; //进位值
        while (end1 >= 0 || end2 >= 0)
        {
            int x1 = 0, x2 = 0;
            if (end1 >= 0)
            {	
            	//'5'-'0'=5
                x1 = num1[end1] - '0';
                --end1;
            }
            if (end2 >= 0)
            {
                x2 = num2[end2] - '0';
                --end2;
            }
            int val = x1 + x2 + next;
            if (val > 9)
            {
                next = 1;
                val -= 10;
            }
            else
                next = 0;
            retstr += val + '0';
        }
        //循环结束之后判断是否还有进位,比如1+9
        if (next == 1)
            retstr += next + '0';
        reverse(retstr.begin(), retstr.end());

        return retstr;
    }
};

在这里插入图片描述

以上就是今天的题目了,希望我的文章对你有所帮助,欢迎👍点赞 ,📝评论,🌟关注,⭐️收藏

  • 77
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 66
    评论
评论 66
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寄一片海给你

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

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

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

打赏作者

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

抵扣说明:

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

余额充值