文章目录
🍎组队竞赛
🍉题目要求
🍉思路分析
要求水平值总和的最大值,只需要保证每支队伍的水平值最大
,那么和就最大。
🍉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;
}
结果测试和上面的两个用例吻合
🍎删除公共字符串
🍉题目要求
🍉思路分析
🍉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题
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;
}
};