前言
前篇文章提到我的背景[Leetcode 前传] 个人背景、优质资源分享虽然不像很多很完美的大神缴出的漂亮成绩单,但是想跟大家分享平凡人也可以努力的人生,若是你现在很学业很凄惨、觉得人生没希望的人加油打气,这两年我也是这样慢慢这样走过来到现在很多事情都越来越好的迹象,也希望持续进步下去就可以在某天也可以像那些大神一样拿出一点可以看的事蹟,之后也有机会也想跟大家分享有关读书方法转变的以及如何从一个废物到月平均一天学习4.5个小时的一些过程。
这篇文主要要分享开始刷Blind1~17以及第一次参加週赛的心得及题目的解题过程。以后都会每个礼拜分享週赛的解题过程以及会分享当週除了週赛一些我觉得不错的题目!
Blind 169 (1~17)
优质神文系列1 to 75 then 169 (与新手常犯的错)里面有提到,许多人準备开始刷leetcode会碰到的问题,如何开始以及如何规划,整个系列都建议大家详读,对我自己帮助超级多的。
如果是跟我一样没刷过题、没打过比赛,但你是资讯相关科系毕业修过资料结构、演算法都建议直接从Blind 169开始,那我帮各位整理三大重点(完全新手可以参考系列文另外一篇 )
以上两点,在大神的文里面都有解释,我就不在多说赘述。
但我可以给一个实际的例子,我在大学时,有一个学弟刚好也要考CPE,他就是属于钻牛角尖,而且都坚持要自己想出来那型,但必须说残酷的事实是这只是在安慰自己很努力而已,因为资料结构、演算法不会你根本不可能写出来.我们要先承认自己在leetcode还在1+1=2的阶段,你在这阶段问老师1+1为什么等于2老师也只会跟你说,以后大学会证明(事后觉得他欺骗我),最后的结果就是,我几乎都看解答,而他浪费时间最后还是得看解答~虽然最后结果差不多,但我花的时间可能只有他三分之一不到
在大神文中有提到这个网站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: 22Explanation: 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型反转,直冲云霄~~