iT邦幫忙

1

前言

前篇文章提到我的背景[Leetcode 前傳] 個人背景、優質資源分享雖然不像很多很完美的大神繳出的漂亮成績單,但是想跟大家分享平凡人也可以努力的人生,若是你現在很學業很淒慘、覺得人生沒希望的人加油打氣,這兩年我也是這樣慢慢這樣走過來到現在很多事情都越來越好的跡象,也希望持續進步下去就可以在某天也可以像那些大神一樣拿出一點可以看的事蹟,之後也有機會也想跟大家分享有關讀書方法轉變的以及如何從一個廢物到月平均一天學習4.5個小時的一些過程。

這篇文主要要分享開始刷Blind1~17以及第一次參加週賽的心得及題目的解題過程。以後都會每個禮拜分享週賽的解題過程以及會分享當週除了週賽一些我覺得不錯的題目!

Blind 169 (1~17)

優質神文系列1 to 75 then 169 (與新手常犯的錯)裡面有提到,許多人準備開始刷leetcode會碰到的問題,如何開始以及如何規劃,整個系列都建議大家詳讀,對我自己幫助超級多的。
如果是跟我一樣沒刷過題、沒打過比賽,但你是資訊相關科系畢業修過資料結構、演算法都建議直接從Blind 169開始,那我幫各位整理三大重點(完全新手可以參考系列文另外一篇

  • 不到200題,五分鐘內想不出做法直接看解答
  • 不要鑽牛角尖
  • 效率很重要,因為你耐心有限

以上兩點,在大神的文裡面都有解釋,我就不在多說贅述。
但我可以給一個實際的例子,我在大學時,有一個學弟剛好也要考CPE,他就是屬於鑽牛角尖,而且都堅持要自己想出來那型,但必須說殘酷的事實是這只是在安慰自己很努力而已,因為資料結構、演算法不會你根本不可能寫出來.我們要先承認自己在leetcode還在1+1=2的階段,你在這階段問老師1+1為什麼等於2老師也只會跟你說,以後大學會證明(事後覺得他欺騙我/images/emoticon/emoticon70.gif),最後的結果就是,我幾乎都看解答,而他浪費時間最後還是得看解答~雖然最後結果差不多,但我花的時間可能只有他三分之一不到
在大神文中有提到這個網站Blind169時間規劃,他是用來規劃你刷Blind169的時間規劃,你可以設計你一個禮拜要花多少時間在leetcode上面,在養成每天刷題的習慣之後(前面適應的20題),個人建議有學業跟工作的情況下也不要少於10小時。

最後附上我用Notion整理出來的Bind169題庫、解答裡面有我寫的解答,大部分都沒有解說啦(因為大部分網路解說都很好了,我就不再重新造輪子了),不過我有參考別人的解答我就會附上我覺得還不錯的連結~

Weekly Contest322

一樣先分享優質神文系列學而不思則惘 Leetcode Contest,這篇文章,也是我第一篇文章有提到的作者系列文之一,裡面有提到週賽是什麼,以及打週賽對一個新手及老手的好處,其實我在開始刷leetcod時還沒有看到這篇文,所以本來預計最快也要把Blind169刷完才去打leetcode週賽,在看完這篇文之後,就直接到Leetcode上去按註冊了!,在參賽前我練了40題左右(20題rating1100~1400、前16題Blind還有一些是演算法學習之-Leetcode-破關總指南(一)這裡面所提到的那些題目。所以這次參賽給自己的期待是寫出第一題,第二題努力試試看,沒想到我解出前兩題還有時間去想一下第三題。

第一題 Circular Sentence

class Solution {
public:
    bool isCircularSentence(string sentence) {
        int n = sentence.size();
        int left = 0;
        if (sentence[0] != sentence[n - 1]) return false;  //處理頭尾
        for (int i = 0; i < n; i++) {
            if (sentence[i] == ' ') {
                if(sentence[i - 1] != sentence[i + 1]) return false;//中間每字頭尾是否相同
            }
        }
        return true;
    }
};

題意說明

題目很簡單,給一個句子,裡面每個單字,前單字的最後一個字,要等於後面那個單字的第一個字

程式碼說明

想法很簡單,先找到空格然後前後的字母是不是一樣的就可以了(這樣就比較了中間前字的尾巴跟後面一個字的頭)
但會漏掉頭尾的case所以我另外處理了

第二題Divide Players Into Teams of Equal Skill

題意說明

Input: skill = [3,2,5,1,3,4]
Output: 22
Explanation: 
Divide the players into the following teams: (1, 5), (2, 4), (3, 3), where each team has a total skill of 6.
The sum of the chemistry of all the teams is: 1 * 5 + 2 * 4 + 3 * 3 = 5 + 8 + 9 = 22.

給一數字串列(沒有排序),代表每個隊員的能力分數,現在你要把所有隊員平均分成n/2隊,每隊的個人能力加總要一樣,也就是說這題是把數字拆成兩兩一組,且每組數字加起來要一樣。最後回傳每組數字的相乘就可以了,若是找不到組合則回傳-1

程式碼說明

class Solution {
public:
    long long dividePlayers(vector<int>& skill) {
        if (skill.size() == 2){
            return skill[0] * skill[1];
        }
        sort(skill.begin(), skill.end());
        int i = 0, j = skill.size() - 1, target = skill[i] + skill[j]; 
        long long int res = 0;
        while (i < j){
            if (skill[i] + skill[j] == target){     //檢查是否有target
                res += skill[i]*skill[j]; 
            } else {
                return -1;
            }
            i++;
            j--;
        }
            return res;
    }
};

這題我花很多時間,主要是方向錯了,我往twosum(hashtable)那方向去思考,所以一直糾結在,我要怎麼找出那個target(像是前面題目給的6),後來就突然想到,若是我將vector裡面的數字排列,因為最後加總都一樣,我直接取第一個配最後一個就會是target了呀!有這個想法之後,程式碼內容就變得相對簡單了。
先將數字串列做排序,第一個數字配最後一個數字就會是一個組合,並先取得加總當作target,中間的判斷式代表檢查是否所有配對都是一樣的值(每組隊員能力加總相同)

週賽心得

這次解出前兩題,後面兩題我有空會去處理,但現在想先以Blind169為中心。
我覺得參加週賽是一個誠實面對自己的過程,因為沒解答給你看,再加上現在平常刷題處於不會就看解答狀況,還是需要有週賽這樣的小測驗去檢驗自己的成果,現在還沒體會到大神說的參加週賽的好處,但我自己是覺得過程挺刺激且開心的,可能我是一個熱衷於競賽的人,rating往下掉沒關係,這很正常,也期望有一天我的Rating來個V型反轉,直衝雲霄~~


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

我要留言

立即登入留言