• 周赛总结--LeetCode单周赛321场 && AcWing79场


    1. LeetCode单周赛321场

    1.1 找出中枢整数

    1.1.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/find-the-pivot-integer/

    1.1.2 解题思路:

            1、先保存 1-n 的和sum;

            2、从 1 开始枚举,判断前 i 项和 cmp 与 sum - cmp + i 是否相等即可。

    1.1.3 代码:

    1. class Solution {
    2. public:
    3. int pivotInteger(int n) {
    4. int sum = 0;
    5. for(int i = 1; i <= n; i ++ ) sum += i;
    6. int cmp = 0;
    7. for(int i = 1; i <= n ;i ++ ) {
    8. cmp += i;
    9. if(cmp == (sum - cmp + i)) return i;
    10. }
    11. return -1;
    12. }
    13. };

    1.2 追加字符以获得子序列

    1.2.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/append-characters-to-string-to-make-subsequence/

    1.2.2 解题思路:

            用双指针来判断是否存在一个 s 中的子序列等于 t,若不存在则当前枚举到 t 中剩下的字母都是需要追加到字母。

    1.2.3 代码:

    1. class Solution {
    2. public:
    3. int appendCharacters(string s, string t) {
    4. int n = t.size();
    5. int m = s.size();
    6. int idx = 0;
    7. for(int i = 0, j = 0; j < m; j ++) {
    8. if(t[i] == s[j]) {
    9. i ++;
    10. idx = i;
    11. }
    12. while(t[i] != s[j] && j < m) j ++;
    13. if(t[i] == s[j]) {
    14. i ++;
    15. idx = i;
    16. }
    17. }
    18. int res = n - idx;
    19. if(res < 0) return 0;
    20. else return res;
    21. }
    22. };

    1.3 从链表中移除节点

    1.3.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/remove-nodes-from-linked-list/

    1.3.2 解题思路:

            具体思路见代码。

    1.3.3 代码:

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode() : val(0), next(nullptr) {}
    7. * ListNode(int x) : val(x), next(nullptr) {}
    8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
    9. * };
    10. */
    11. class Solution {
    12. public:
    13. ListNode* removeNodes(ListNode* head) {
    14. if(head == nullptr) return head;//如果head为空直接return就好了
    15. ListNode* res = removeNodes(head->next);//递归处理返回的链表头一定是最大值
    16. if(res == nullptr) return head;
    17. if(res->val > head->val) return res; //删除头节点
    18. head->next = res; //不删除头节点
    19. return head;
    20. }
    21. };

    1.4 统计中位数为K的子数组

    1.4.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/count-subarrays-with-median-k/

    1.4.2 解题思路:

            1、转换为数学式子;

            2、在奇数长度下的情况:

                    (1)统计K左侧的数的个数sum1,K右侧的数的个数sum2,必然有sum1 == sum2;

                    (2)由(1)知:左侧小于K的数的个数 + 右侧小于K的数的个数 == 左侧大于K的数的  个数 + 右侧大于K的数的个数;

                    (3)由(2)知:左侧小于K的数的个数 - 左侧大于K的数的个数 ==  右侧大于K的数的个数 - 右侧小于K的数的个数;将 “ - ”看作是 -1, “+”看作是 +1,例如:

             3、找左右匹配的数对,如上图;

            4、对于偶数个的情况:左侧小于K的数的个数 - 左侧大于K的数的个数  + 1 ==  右侧大于K的数的个数 - 右侧小于K的数的个数。

    1.4.3 代码:

    1. class Solution {
    2. public:
    3. int countSubarrays(vector<int>& nums, int k) {
    4. //存k的下标
    5. int pos = find(nums.begin(), nums.end(), k) - nums.begin(), n = nums.size();
    6. unordered_map<int, int> cnt;
    7. cnt[0] = 1;
    8. for(int i =pos + 1, c = 0; i < n; i ++ ) {
    9. c += nums[i] > k ? 1 : -1;
    10. ++ cnt[c];
    11. }
    12. int ans = cnt[0] + cnt[1];
    13. for(int i = pos - 1, c = 0; i >= 0; i --) {
    14. c += nums[i] < k ? 1 : -1;
    15. ans += cnt[c] + cnt[c + 1];
    16. }
    17. return ans;
    18. }
    19. };

    2.AcWing周赛79场

    2.1 数列元素

    2.1.1 原题链接:4722. 数列元素 - AcWing题库

    2.1.2 解题思路:

            预处理前缀和,再从前往后遍历找到相等情况并输出YES,找不到则输出NO。

    2.1.3 代码:

    1. #include <iostream>
    2. #include <cstring>
    3. #include <algorithm>
    4. using namespace std;
    5. const int N = 510;
    6. int s[N];
    7. int main()
    8. {
    9. int n;
    10. cin >> n;
    11. for(int i = 1; i <= N; i ++ ) s[i] = s[i - 1] + i;
    12. bool flag = false;
    13. for(int i = 1; i <= N; i ++ ) {
    14. if(s[i] == n) flag = true;
    15. }
    16. if(flag) puts("YES");
    17. else puts("NO");
    18. return 0;
    19. }

    2.2 队列

    2.2.1 原题链接:4723. 队列 - AcWing题库

    2.2.2 解题思路:

            1、先判断 n 属于哪个区间;

            2、再判断 n 属于第几个元素。

    2.2.3 代码:

    1. #include <iostream>
    2. #include <cstring>
    3. #include <algorithm>
    4. using namespace std;
    5. int main()
    6. {
    7. int n;
    8. cin >> n;
    9. int s = 0, k = 5;
    10. while(s + k < n) {
    11. s += k;
    12. k *= 2;
    13. }
    14. n -= s;
    15. int len = k / 5;
    16. int t = (n + len - 1) / len;
    17. cout << (char) (t - 1 + 'a') << endl;
    18. return 0;
    19. }
  • 相关阅读:
    redis雪崩、穿透、击穿
    SQL和Python,哪个更容易自学?哪个更适合数据工作的编程新手?
    SpringCloud-4.服务网关(GateWay)
    Integer超出-128——127范围的数值比较为什么要用equals
    《Effective C++》阅读总结(二):类的构造、析构和赋值
    谷歌浏览器的视频下载插件推荐
    GoWeb -- gin框架的入门和使用(2)
    磨金石教育摄影技能干货分享|那些酷炫的照片是怎么拍出来的?
    Android使用Jetpack WindowManager来开发可折叠设备的探索
    哪里可提供低代码开源大数据解决方案?
  • 原文地址:https://blog.csdn.net/m0_58068094/article/details/128065085