首页 > 其他分享 >第 358 场周赛 - 力扣(LeetCode)

第 358 场周赛 - 力扣(LeetCode)

时间:2023-08-16 11:04:19浏览次数:50  
标签:周赛 ListNode val nums int next 力扣 ans LeetCode

第 358 场周赛 - 力扣(LeetCode)

2815. 数组中的最大数对和 - 力扣(LeetCode)

双for遍历即可

class Solution {
public:
    int maxSum(vector<int>& nums) {
        
        auto re = [](int x){
            int ma = 0;
            while(x){
                if(x % 10 > ma) ma = x % 10;
                x /= 10;
            }
            return ma;
        };
        
        int n = nums.size();
        int ans = -1;
        for(int i = 0;i < n;i ++){
            for(int j = i + 1;j < n;j ++){
                if(re(nums[i]) == re(nums[j]) && nums[i] + nums[j] > ans)
                    ans = nums[i] + nums[j];
            }
        }

        return ans;
    }
};

2816. 翻倍以链表形式表示的数字 - 力扣(LeetCode)

不太常用链表,还是现查了一下怎么用qwq,还写了个字符串乘\(2\)的函数orz

原版本

CLICK ME
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    string multiplyByTwo(const std::string& numberString) {
        std::string num1(numberString.rbegin(), numberString.rend());
        string num2 = num1;
        string result = "";
        int carry = 0;
        for (int i = 0; i < num1.length(); i++) {
            int digit1 = num1[i] - '0';
            int digit2 = num2[i] - '0';
            int sum = digit1 + digit2 + carry;
            int currentDigit = sum % 10;
            result.insert(0, 1, currentDigit + '0');
            carry = sum / 10;
        }
        if (carry != 0) {
            result.insert(0, 1, carry + '0');
        }
        return result;
    }
    ListNode* doubleIt(ListNode* head) {
        string s = "";
        while(head != nullptr){
                s += head->val + '0';
            head = head->next;
        }
        s = multiplyByTwo(s);
        ListNode *ans = nullptr;
        ListNode *num = nullptr;
        for(int i = 0;i < s.size();i ++){
            ListNode* t = new ListNode;
            t->val = s[i] - '0';
            t->next = nullptr;
            if(ans == nullptr){
                ans = t;
                num = t;
            }else{
                num->next = t;
                num = t;
            }
        }
        return ans;
    }
};

后来看了灵神的代码,发现很妙,一个数乘\(2\)最多就只会进一位,所以在最开始判断首位数是不是大于4,是的话就在前面新加一个节点,其余的就是跟着模拟,如果下一个数大于4,那么它前一个数就应该进1,它自己就等于二倍后的个位数了

class Solution {
public:
    ListNode* doubleIt(ListNode* head) {
        if(head->val > 4)
            head = new ListNode(0, head);
            for(auto i = head; i; i = i->next){
                i->val = i->val * 2 % 10;
                if(i->next && i->next->val > 4)
                i->val ++;
            }
        return head;
    }
};

2817. 限制条件下元素之间的最小绝对差 - 力扣(LeetCode)(平衡树+双指针)

用双指针把每隔\(x\)个元素都加进去,但是不用弹出,因为题目说了是至少大于等于\(x\)个数,指针往下一个数扫描时,它的前\(x+1\)个数也能被存进去,然后就是二分去找一个最小值,因为二分查找的是第一个大于等于当前的数,但是也可能它的前一个差值更小,这里也要比较它二分查找出的前一个,因为要做自减操作,防止空指针我们要提前在set里存一个最小值和一个最大值,\(INT\_MIN / 2\)是防止数据溢出int范围,如果你set存的是long long类型那就不用担心这个问题了

class Solution {
public:
    int minAbsoluteDifference(vector<int>& nums, int x) {
        int ans = INT_MAX, n = nums.size();
        set<int> s = {INT_MIN / 2, INT_MAX};
        for(int i = x;i < n;i ++){
            s.insert(nums[i - x]);
            auto t = s.lower_bound(nums[i]);
            ans = min({ans, *t - nums[i], nums[i] - *--t});
        }
        return ans ;
    }
};

2818. 操作使得分最大 - 力扣(LeetCode)(质因数分解+单调栈+快速幂)

看了很多佬说这道题不错,不过有点难,先留着,后面其他题补了再来补

标签:周赛,ListNode,val,nums,int,next,力扣,ans,LeetCode
From: https://www.cnblogs.com/Kescholar/p/17633418.html

相关文章

  • 【leetcode】404 左叶子之和
    https://leetcode.cn/problems/sum-of-left-leaves/description/【分析】该题要求左叶子之和。如果我们对当前节点进行叶子节点的判断,那么我们是不知道当前节点是左叶子还是右叶子的。所以我们应该在叶子结点的上层(父节点)进行判断。【代码】classSolution:defsumOfL......
  • 代码随想录算法训练营第十三天|单调数列:滑动窗口最大值(力扣239.)、优先级队列:前k个高
    单调数列:滑动窗口最大值(力扣239.)给定滑动窗口的范围,求每个滑动窗口范围内的最大值使用单调队列实现对于最大值数字前面的数字不存入数列,对于最大值数字后面的数字存入数列中单调队列中数字的大小呈递减顺序pop(value):如果窗口移除的元素等于单调队列的队口元素,则pop;否则什......
  • LeetCode -- 19. 删除链表的倒数第 N 个结点
     一般的删除问题,可以直接删除(找符合条件的,找到了直接删掉),延迟删除(打标记,找完了再删除),栈,双指针 在链表中删除一个节点,要找到其前面一个节点cur,然后cur->next=cur->next->next即可 方法一:直接删除我们先算出链表长度len,要删除倒第n个节点就是删除第len-n......
  • 力扣---833. 字符串中的查找与替换
    你会得到一个字符串 s (索引从0开始),你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出:indices, sources,  targets。要完成第 i 个替换操作:检查 子字符串  sources[i] 是否出现在 原字符串 s 的索引 indices[i] 处。如果没有出......
  • LeetCode 121.买卖股票的最佳时机
    1.题目:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获......
  • 【LeetCode 571. 给定数字的频率查询中位数】WITH RECURSIVE实现Tally的逆操作
    目录题目地址代码题目地址https://leetcode.cn/problems/find-median-given-frequency-of-numbers/description/代码WITHRECURSIVERecCTEAS(SELECTnum,frequency-1asremaining_frequencyFROMNumbersWHEREfrequency>0UNIONALLSELECTn......
  • 代码随想录算法训练营第十一天|力扣20.有效的括号、力扣1047.删除字符串中所有相邻重
    有效的括号(力扣20.)括号匹配时使用栈解决的经典问题题意其实就像我们在写代码的过程中,要求括号的顺序是一样的有左括号,那么在对应位置则必须有右括号第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以returnfalse第二种情况:遍历字......
  • 力扣- 删除有序数组中的重复项
    给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:更改......
  • Leetcode 206. 反转链表(Reverse linked list)
    题目链接给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]提示:链表中节点的数目范围是[0,5000]-5000<=Node.val<=5000思路迭代法:创建两个指针,分别指向当前节......
  • 牛客周赛 Round 7
    牛客周赛Round7A-游游的you矩阵_牛客周赛Round7(nowcoder.com)把四种字符凑一起看看有没有\(y,o,u\)就行#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn,m......