C++每日一练——组队竞赛&&两数相加
文章目录
- 🍎组队竞赛
-
- 🍉题目要求
- 🍉思路分析
- 🍉C++代码
- 🍎删除公共字符串
-
- 🍉题目要求
- 🍉思路分析
- 🍉C++代码
- 🍑链表的两数相加
- 🍑字符串相加
🍎组队竞赛
🍉题目要求
每组有3个队员,在3*n个选手,n组队伍中找到每组队伍的水平值(
队员中第二高的水平值
),然后求出所有队伍水平值总和的最大值
第一行输入:队伍的个数n
第二行输入:3 * n个选手的水平值
输出:水平值总和可能超过int所以设为long
🍉思路分析
要求水平值总和的最大值,只需要保证每支队伍的水平值最大
,那么和就最大。
如何使每支队伍的水平值最大呢?
先对3 * n个选手
排升序
,然后从大到小找到每支队伍最大的水平值相加,得到想要的输出结果,从3*n-2开始每隔一个数就是每组的最大水平值
🍉C++代码
#include #include #include 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 #include 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; }};
以上就是今天的题目了,希望我的文章对你有所帮助,欢迎👍点赞 ,📝评论,🌟关注,⭐️收藏