• AcWing周赛76场 && LeetCode单周赛318场


    1.AcWing周赛第76场

    1.1 4713.反转字符串

    1.1.1 原题链接:4713. 反转字符串 - AcWing题库

    1.1.2 解题思路:

            调用reverse函数进行字符串翻转即可。

    1.1.3 参考代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. string s, t;
    8. cin >> s >> t;
    9. reverse(s.begin(), s.end());
    10. if(s == t) puts("YES");
    11. else puts("NO");
    12. return 0;
    13. }

    1.2 4714.数对

    1.2.1 原题链接:4714. 数对 - AcWing题库

    1.2.2 解题思路:

            题目的意思可以转化为求每个字符的出现次数,然后统计所有的字符的出现次数的平方和即为答案,但是会爆int,所以需要用long long来存储答案。

    1.2.3 参考代码:

    代码1:

    1. #include <iostream>
    2. #include <cstring>
    3. #include <algorithm>
    4. #include <unordered_map>
    5. using namespace std;
    6. typedef long long LL;
    7. const int N = 1e5 + 10;
    8. int a[N];
    9. int main()
    10. {
    11. string s;
    12. cin >> s;
    13. int n = s.size();
    14. LL res = 0;
    15. unordered_map<char, int> mp;
    16. for(int i = 0; i < n; i ++ ) mp[s[i]] ++;
    17. for(auto& [k,v]: mp) {
    18. res += 1ll * v * v;
    19. }
    20. cout << res << endl;
    21. return 0;
    22. }

    代码2:

    1. #include <iostream>
    2. #include <unordered_map》
    3. using namespace std;
    4. typedef long long LL;
    5. int main () {
    6. unordered_map <char,int> mp;
    7. char ch;
    8. while (cin >> ch) mp[ch]++;
    9. LL ans = 0;
    10. for (char i = 'a';i <= 'z';i++) ans += (LL)mp[i] * mp[i];
    11. for (char i = '0';i <= '9';i++) ans += (LL)mp[i] * mp[i];
    12. cout << ans << endl;
    13. return 0;
    14. }

    1.3 4715.构造数组

    1.3.1 原题链接:4715. 构造数组 - AcWing题库

    1.3.2 解题思路:

            前后两次遍历即可。

            大致思路其实就是去看连续的'>'和连续的'<',只有这样才会对每个数下限产生制约,否则可以为1。

    1.3.3 参考代码:

    1. #include <iostream>
    2. #include <cstring>
    3. #include <algorithm>
    4. #include <vector>
    5. using namespace std;
    6. const int N = 1010;
    7. int a[N];
    8. int main()
    9. {
    10. int n;
    11. string s;
    12. cin >> n >> s;
    13. vector<int> a(n, 1);
    14. for(int i = 0; i < s.size(); i ++ ) {
    15. if(s[i] == '=') a[i + 1] = a[i];
    16. else if(s[i] == '<') a[i + 1] = a[i] + 1;
    17. }
    18. for(int i = s.size() - 1; i >= 0; i -- ) {
    19. if(s[i] == '=') a[i] = a[i + 1];
    20. else if(s[i] == '>') a[i] = max(a[i], a[i + 1] + 1);
    21. }
    22. for(int i = 0; i < n; i ++ ) cout << a[i] << ' ';
    23. return 0;
    24. }

    2. LeetCode单周赛 318

    2.1 6229.对数组执行操作

    2.1.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/apply-operations-to-an-array/

    2.1.2 解题思路:

            具体思路见代码。

    2.1.3 参考代码:

    1. class Solution {
    2. public:
    3. vector<int> applyOperations(vector<int>& nums) {
    4. int n = nums.size();
    5. vector<int> res(n, 0);
    6. for(int i = 0; i < n - 1; i ++ ) {
    7. if(nums[i] == nums[i + 1]) {
    8. nums[i] = nums[i] * 2;
    9. nums[i + 1] = 0;
    10. }
    11. }
    12. int cnt = 0;
    13. for(int i = 0; i < n; i ++ ) {
    14. if(nums[i]) {
    15. res[cnt++] = nums[i];
    16. }
    17. }
    18. return res;
    19. }
    20. };

    2.2 6230.长度为K子数组中的最大和

    2.2.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/contest/weekly-contest-318/problems/maximum-sum-of-distinct-subarrays-with-length-k/

    2.2.2 解题思路:

            1、用定长滑动窗口处理子数组中的元素和。

            2、用哈希表统计每个子数组中元素的个数。

            3、判断子数组中元素的个数是否等于k,若是,则更新答案res,反之不更新答案res。

    2.2.3 参考代码:

    1. typedef long long ll;
    2. class Solution {
    3. public:
    4. long long maximumSubarraySum(vector<int>& nums, int k) {
    5. ll res = 0, tmp = 0;
    6. int n = nums.size();
    7. unordered_map<int, int> mp;
    8. for(int i = 0; i < k; i ++ ) {
    9. tmp += nums[i];
    10. mp[nums[i]] ++;
    11. }
    12. if(mp.size() == k) res = max(res, tmp);
    13. for(int i = k; i < n; i ++ ) {
    14. tmp -= nums[i - k];
    15. tmp += nums[i];
    16. mp[nums[i - k]] --;
    17. mp[nums[i]] ++;
    18. if(mp[nums[i - k]] == 0) mp.erase(nums[i-k]);
    19. if(mp.size() == k && tmp > res) {
    20. res = tmp;
    21. }
    22. }
    23. return res;
    24. }
    25. };

    2.3 6231.雇佣K位工人的总代价

    2.3.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/total-cost-to-hire-k-workers/

    2.3.2 解题思路:

            1、用优先队列来维护;

            2、每次取出队首元素加到答案中。

    2.3.3 参考代码:

    1. typedef long long ll;
    2. typedef pair<int, int> PII;
    3. class Solution {
    4. public:
    5. long long totalCost(vector<int>& costs, int k, int candidates) {
    6. ll res = 0;
    7. int n = costs.size();
    8. int l = candidates, r = n - candidates;
    9. priority_queue<PII, vector<PII>, greater<PII>> q;
    10. if(l < r) {
    11. for(int i = 0; i < l; i ++ ) q.emplace(costs[i], i);
    12. for(int i = r; i < n; i ++ ) q.emplace(costs[i], i);
    13. }
    14. else {
    15. for(int i = 0; i < n; i ++ ) q.emplace(costs[i], i);
    16. }
    17. for(int i = 0; i < k; i ++ ) {
    18. auto t = q.top();
    19. q.pop();
    20. res += t.first;
    21. if(l < r) {
    22. if(t.second < l) q.emplace(costs[l], l ++);
    23. if(t.second >= r) q.emplace(costs[r - 1], r --);
    24. }
    25. }
    26. return res;
    27. }
    28. };
  • 相关阅读:
    【GEE】​3、 栅格遥感影像波段特征及渲染可视化
    苹果安卓网页的H5封装成App的应用和原生开发的应用有什么不一样?
    力扣26. 删除有序数组中的重复项
    浙大MBA的复试自划线与国家线有什么关系?
    11数据库-进阶
    【代码随想录】Day 50 动态规划11 (买卖股票Ⅲ、Ⅳ)
    (二) selenium元素定位
    陈学智升任VMware全球副总裁、大中华区总裁,面临四个挑战
    iOS开发-WKWebView加载微信H5支付
    【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍
  • 原文地址:https://blog.csdn.net/m0_58068094/article/details/127715965