LeetCode 第187场周赛 & 第25场双周赛小结

题目

本人比较菜,八道题只a了五道比较简单的,在这里简单整理一下思路。

题目就只附上链接,不完全复制过来了。

题目分别是:

5384.拥有最多糖果的孩子

5385.改变一个整数能得到的最大差值

5386.检查一个字符串是否可以打破另一个字符串

5400.旅行终点站

5401.是否所有1都至少相隔k个元素

周赛.png
双周赛.png

题目分析

5384.拥有最多糖果的孩子

这题目描述起来看着挺难的,实际很简单。遍历一遍数组找到数组最大值。然后再次遍历数组,计算每个元素与最大值的差值,如果这个差值大于额外的糖果数量,那么返回false,反之,则返回true

比较简单,完整解答见最后。

5385.改变一个整数能得到的最大差值

这道题思路也比较简单,就是实现起来略微复杂。

首先要将这个数组的每一位数字都取出来,比较直观的想法是对这个数字除10取余可以得到个位数字,然后再对这个除10取商,循环上述过程,直到当前数组小于等于0。

由于这样的过程是从个位数开始存取,为了方便后续操作,我使用了栈来保存每一位数字。

stack s;
while (num > 0){
    s.push(num % 10);
    num /= 10;
}

然后需要将改变这个数字,需要分别改造成最大值和最小值。

改造最大值的方法:从栈的顶部开始遍历,如果第一个元素不等于9,那么将其记录并改为9;如果第一个元素等于9,那么弹出,直到遇到不为9的第一个数字,记录其并改为9。之后不断弹出顶端元素,将与记录值相等的元素都改为9。

改造最大值的过程如下:

int max_num = 0;
int flag = 0;
int len = s.size();
for (int i = 0; i < len; i++){
    if (flag == 0){
        if (s.top() != 9){
            int temp = s.top();
            flag = 1;
        }
    }else {
        if (s.top() == temp) s.top() = 9;
    }
    max_num += pow(10, s.size() - 1) * s.top();
    s.pop();
}

改造最小值的方法比最大值复杂一点,由于不能将首位改为0,所以如果首位不为1的情况,应该将首位的数字全部改成1;如果首位不为1,应该将接下来的第一个非0元素改为0。

改造最小值的过程如下:

int min_num = 0;
while (s.top() == 1 || s.top() == 0){
    min_num += pow(10, s.size() - 1) * s.top();
    s.pop();
    flag = 0;
}
int len = s.size();
int temp = s2.top();
for (int i = 0; i < s.size(); i++){
    if (flag == 0){
        if (s.top() == temp) s.top() = 0;
    }else {
        if (s.top() == temp) s.top() = 1;
    }
    min_num += pow(10, s.size() - 1) * s.top();
    s.pop();
}

最后返回最大值与最小值的差值即可。

5386.检查一个字符串是否可以打破另一个字符串

这道题我最初想复杂了,我最初没有思路,只好暴力求解:利用回溯算法求出s1s2的全排列,然后将依次将两个字符串的全排列对比是否可以打破,只要找到一个可以打破的,就返回true

上述思路可以计算出结果,但是最后几组数据会超时。最后几分钟时,我突然想到,可以给s1s2分别按字典序排序,然后直接计算排序后的s1s2能否打破或被打破即可。

在这里简单梳理一下分辨两个字符串能否打破或被打破的过程:用两个计数器分别记录s1[i] > s2[i]s1[i] < s2[i]的个数,如果s1[i] == s2[i],两个计数器都自增1。

    bool isBreak(string s1, string s2){
        if (s1.length() == 0) return false;
        int in = 0;
        int out = 0;
        int len = s1.length();
        for (int i = 0; i < len; i++){
            if (s1[i] == s2[i]){
                in++;
                out++;
            }
            else if (s1[i] > s2[i]) in++;
            else out++;
        }
        return out == len || in == len;
    }

题目完整的解答见最后。

5400.旅行终点站

这道题目也是看起来复杂实际简单的。

我是暴力解开的,遍历每个路线,取终点,然后检验这个终点是否是别的路线的,若不是任何其他路线的起点,则返回这个终点即可。

int count = 0;
int len = paths.size();
for (auto t1 : paths){
    for (auto t2 : paths){
        if (t1[1] == t2[0]) count++;
        else break;
    }
    if (len == count) return t1[1];
    else continue;
}

完整解答见最后。

5401.是否所有1都至少相隔k个元素

这道题也比较简单。使用一个数组记录给定数组中值为1的索引,然后遍历这个索引数组,如果相邻元素差值小于k,则返回false。

for (int i = 0; i < nums.size(); i++){
    if (nums[i] == 1) temp.push_back(i);
}
if (temp.size() == 0) return true;
for (int i = 0; i < temp.size() - 1; i++){
    if (temp[i + 1] - temp[i] - 1 < k) return false;
}
return true;

完整的解答见最后。


题目解答

5384.拥有最多糖果的孩子

class Solution {
public:
    vector res;
    vector kidsWithCandies(vector& candies, int extraCandies) {
        if (candies.size() == 0) return res;
        int max = candies[0];
        for (auto temp : candies){
            if (temp > max) max = temp;
        }
        // 思路 找到最大值,再遍历一遍数组,如果差值小于等于extracandies,则返回true;
        for (auto temp : candies){
            if (max - temp <= extraCandies) res.push_back(true);
            else res.push_back(false);
        }
        return res;
    }
};

5385.改变一个整数能得到的最大差值

class Solution {
public:
    stack s1, s2;
    
    int maxDiff(int num) {
        if (num < 10) return 8;
        
        while (num > 0){
            s1.push(num % 10);
            num /= 10;
        }
        s2 = s1;
        int len = s1.size();
        int num1 = 0;
        int num2 = 0;
        int flag = 0;
        int temp;
        for (int i = 0; i < len; i++){
            if (flag == 0){
                if (s1.top() != 9) {
                    temp = s1.top();
                    s1.top() = 9;
                    flag = 1;
                }
            }else {
                if (s1.top() == temp){
                    s1.top() = 9;
                }
            }
            num1 += s1.top() * pow(10, s1.size() - 1);
            s1.pop();
        }
        while (s2.top() == 1 || s2.top() == 0){
            num2 += pow(10, s2.size() - 1) * s2.top();
            s2.pop();
            flag = 0;
        }
        len = s2.size();
        temp = s2.top();
        for (int i = 0; i < len; i++){
            if (flag == 0){
                if (s2.top() == temp){
                    s2.top() = 0;
                }
            }else {
                if (s2.top() == temp){
                    s2.top() = 1;
                }
            }
            num2 += pow(10, s2.size() - 1) * s2.top();
            s2.pop();
        }
        
        return num1 - num2;
    }
};

5386.检查一个字符串是否可以打破另一个字符串

bool isBreak(string s1, string s2){
    if (s1.length() == 0) return false;
    int in = 0;
    int out = 0;
    int len = s1.length();
    for (int i = 0; i < len; i++){
        if (s1[i] == s2[i]){
            in++;
            out++;
        }
        else if (s1[i] > s2[i]) in++;
        else out++;
    }
    return out == len || in == len;
}
bool checkIfCanBreak(string s1, string s2) {
    sort(s1.begin(), s1.end());
    sort(s2.begin(), s2.end());
    return isBreak(s1, s2);
}

5400.旅行终点站

class Solution {
public:
    string res;
    string destCity(vector>& paths) {
        if (paths.size() == 1) return paths[0][1];
        int count = 0;
        int len = paths.size();
        for (auto t1 : paths){
            for (auto t2 : paths){
                if (t1[1] == t2[0]) break;
                else count++;
            }
            if (count == len){
                res = t1[1];
                break;
            }else {
                count = 0;
            }
        }
        return res;
    }
};

5401.是否所有1都至少相隔k个元素

class Solution {
public:
    vector temp;
    bool kLengthApart(vector& nums, int k) {
        if (nums.size() == 1) return true;
        for (int i = 0; i < nums.size(); i++){
            if (nums[i] == 1) temp.push_back(i);
        }
        if (temp.size() == 0) return true;
        for (int i = 0; i < temp.size() - 1; i++){
            if (temp[i + 1] - temp[i] - 1 < k) return false;
        }
        return true;
    }
};

你可能感兴趣的:(LeetCode 第187场周赛 & 第25场双周赛小结)