LeetCode 第187場周賽 & 第25場雙周賽小結

題目

本人比較菜浴捆,八道題只a了五道比較簡單的办成,在這里簡單整理一下思路。

題目就只附上鏈接胜宇,不完全復制過來了。

題目分別是:

5384.擁有最多糖果的孩子

5385.改變一個整數(shù)能得到的最大差值

5386.檢查一個字符串是否可以打破另一個字符串

5400.旅行終點站

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

周賽.png
雙周賽.png

題目分析

5384.擁有最多糖果的孩子

這題目描述起來看著挺難的恢着,實際很簡單桐愉。遍歷一遍數(shù)組找到數(shù)組最大值。然后再次遍歷數(shù)組掰派,計算每個元素與最大值的差值从诲,如果這個差值大于額外的糖果數(shù)量,那么返回false靡羡,反之系洛,則返回true

比較簡單亿眠,完整解答見最后碎罚。

5385.改變一個整數(shù)能得到的最大差值

這道題思路也比較簡單,就是實現(xiàn)起來略微復雜纳像。

首先要將這個數(shù)組的每一位數(shù)字都取出來荆烈,比較直觀的想法是對這個數(shù)字除10取余可以得到個位數(shù)字,然后再對這個除10取商竟趾,循環(huán)上述過程憔购,直到當前數(shù)組小于等于0。

由于這樣的過程是從個位數(shù)開始存取岔帽,為了方便后續(xù)操作玫鸟,我使用了棧來保存每一位數(shù)字。

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

然后需要將改變這個數(shù)字犀勒,需要分別改造成最大值和最小值屎飘。

改造最大值的方法:從棧的頂部開始遍歷妥曲,如果第一個元素不等于9,那么將其記錄并改為9钦购;如果第一個元素等于9檐盟,那么彈出,直到遇到不為9的第一個數(shù)字押桃,記錄其并改為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的情況磕昼,應該將首位的數(shù)字全部改成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发框。

上述思路可以計算出結果,但是最后幾組數(shù)據(jù)會超時煤墙。最后幾分鐘時梅惯,我突然想到,可以給s1s2分別按字典序排序仿野,然后直接計算排序后的s1s2能否打破或被打破即可铣减。

在這里簡單梳理一下分辨兩個字符串能否打破或被打破的過程:用兩個計數(shù)器分別記錄s1[i] > s2[i]s1[i] < s2[i]的個數(shù),如果s1[i] == s2[i]脚作,兩個計數(shù)器都自增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個元素

這道題也比較簡單引谜。使用一個數(shù)組記錄給定數(shù)組中值為1的索引,然后遍歷這個索引數(shù)組稀蟋,如果相鄰元素差值小于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<bool> res;
    vector<bool> kidsWithCandies(vector<int>& candies, int extraCandies) {
        if (candies.size() == 0) return res;
        int max = candies[0];
        for (auto temp : candies){
            if (temp > max) max = temp;
        }
        // 思路 找到最大值,再遍歷一遍數(shù)組链嘀,如果差值小于等于extracandies萌狂,則返回true;
        for (auto temp : candies){
            if (max - temp <= extraCandies) res.push_back(true);
            else res.push_back(false);
        }
        return res;
    }
};

5385.改變一個整數(shù)能得到的最大差值

class Solution {
public:
    stack<int> 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<vector<string>>& 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<int> temp;
    bool kLengthApart(vector<int>& 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;
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末怀泊,一起剝皮案震驚了整個濱河市茫藏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌霹琼,老刑警劉巖务傲,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枣申,居然都是意外死亡售葡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門忠藤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挟伙,“玉大人,你說我怎么就攤上這事模孩〖饫” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵榨咐,是天一觀的道長介却。 經(jīng)常有香客問我,道長块茁,這世上最難降的妖魔是什么齿坷? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮龟劲,結果婚禮上胃夏,老公的妹妹穿的比我還像新娘。我一直安慰自己昌跌,他們只是感情好仰禀,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚕愤,像睡著了一般答恶。 火紅的嫁衣襯著肌膚如雪饺蚊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天悬嗓,我揣著相機與錄音污呼,去河邊找鬼。 笑死包竹,一個胖子當著我的面吹牛燕酷,可吹牛的內容都是我干的。 我是一名探鬼主播周瞎,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼苗缩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了声诸?” 一聲冷哼從身側響起酱讶,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彼乌,沒想到半個月后泻肯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡慰照,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年灶挟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焚挠。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡膏萧,死狀恐怖,靈堂內的尸體忽然破棺而出蝌衔,到底是詐尸還是另有隱情榛泛,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布噩斟,位于F島的核電站曹锨,受9級特大地震影響,放射性物質發(fā)生泄漏剃允。R本人自食惡果不足惜沛简,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斥废。 院中可真熱鬧椒楣,春花似錦、人聲如沸牡肉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽统锤。三九已至毛俏,卻和暖如春炭庙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煌寇。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工焕蹄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阀溶。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓腻脏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親银锻。 傳聞我的和親對象是個殘疾皇子迹卢,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355