🐟 你摸鱼我摸鱼,宗主宝马变青桔。
🐟 你摆烂我摆烂,宗主变成流浪汉。
🐟 你不干我不干,宗主明天捡破烂。
公元2024年7月1日,天气晴转阴转晴转多云
渔夫摸索着将手机闹铃按静音,翻了个身继续睡,虽然宗门是双休制度,但是一周工作的疲惫还未消去,新的一周又要开始了。
这是渔夫从灵界穿越到这个叫地球打工的第7个年头,但还是没有适应这种牛马生活。当闹铃从7点30响到8点,终于再不起床赚窝囊费就要饿死的渔夫终于扛不住了,1分钟起床,2分钟上厕所,3分钟洗脸刷牙洗头,4分钟穿衣服,剩下10分钟欣赏自己的绝世帅脸。妈的,我真他*的帅(作者感叹)🕶️。
终于9点30上班的渔夫在8点20分出门了,不要问为什么这么早出门,因为对宗门爱的深沉🤮
经过一个多小时的地铁蹂躏,在9点43分终于一屁股坐在了工位上,果不其然今天又迟到了。 渔夫不禁心里暗叹:要是还在灵界多好,老子一个御剑飞行,这点距离,眨眼就到了何必如此麻烦,凡人的世界就是烦人。
damn!
上周报了一个算法监督训练营,还交了一个月的饭钱(129rmb)当押金,按照规则必须得每天都要打卡刷算法题,然后要录视频,为了7月份不饿肚子必须得努力奋斗一下了,能提升自己真的好开心😭。
正好这周刚开始,宗门任务不多,先把这个副本下了。 今天的题目有三个:
ps:以下解法和思路都是个人见解,如有争议请以你的理解为准
两数之和
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
const result = {}
for(let i = 0; i < nums.length; i++){
const cur = nums[i];
const diff = target - nums[i];
const diffIndex = result[diff];
if(diffIndex !== undefined){
return [i, diffIndex]
}else{
result[cur] = i;
}
}
};
思路:
- 拆解题目:需要输入两个参数【数组nums和target】,nums里的含有2个数值(A,B),A+B===target,将A,B的下标以数组的形式返回。
- 首先可以想到利用js中的map这个数据类型
- 创建map对象result,循环数组nums
- 在循环中,拿到当前的nums[i],并且计算与target的差(diff)
- 判断result中以diff为key的值是否为undefined,如果为undefined就以当前的nums[i]为key,i为值赋给result
- 如果diff不为undefined,就将i和result[diff]记录的index以数组的形式返回
- return
字母异位词分组
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
if(strs && strs.length < 2){
return [strs];
}
const mapKey = new Map();
for(let i = 0; i < strs.length; i++){
const curr = strs[i];
const sortCurr = curr.split('').sort().join('');
if(mapKey.has(sortCurr)){
const newValue = mapKey.get(sortCurr);
newValue.push(curr);
mapKey.set(sortCurr, newValue)
}else{
mapKey.set(sortCurr, [curr])
}
}
return Array.from(mapKey.values());
};
思路:
- 拆解题目:理解字母异位词,题目最终目的是将含有相同字母的单词分组,最后以数组形式输出出来。
- 由于strs中的每一项的词语是不同的,那么先循环将每一项split再sort再join,再以map的对象将重新组合的字符串当成key,将源单词以数组的形式存储起来
- 循环到下一项重复第2步
- 最后将map对象以values方法输出
- return
最长连续序列
/**
* @param {number[]} nums
* @return {number}
*/
var longestConsecutive = function(nums) {
if(nums.length === 0)return 0
const result = [];
const sortNums = [...new Set(nums.sort((a,b) => a-b))];
let count = 1;
for(let i = 0; i < sortNums.length; i++){
const curr = sortNums[i];
const next = sortNums[i+1];
if(next !== undefined){
if(curr == next - 1){
count++;
}else{
result.push(count)
count = 1;
};
}else{
result.push(count)
}
}
return Math.max(...result)
};
思路:
这个解法没考虑时间复杂度为O(n),因为渔夫记忆力过于差实在是记不住各种复杂度的说法,以后会以文章形式重新梳理一下。
- 拆解题目:本题是为了获取连续最长递增数字的最大长度,并且如果有重复的数字也不算断开
- 首先要想到,获取最大长度得先排序一下,这样才能判断当前项和后一项是否是+1的关系
- 其次要用Set数据类型去重,这样才能保证如果源数组有两个1的并且排序后不会判断为断开
- 再次要使用数组(result)去存储每次中断的长度
- 最后使用Math.max(...result)获取最大长度
- return
在这个过程中,渔夫发现对于Map的方法、Set的方法和Math的方法不甚熟练,还要去使用浏览器去查询,真是令人汗颜😓。等摸完鱼渔夫打算去恶补一下...
okkk,今天的工作先做这些吧,毕竟高楼不是一天建成的,接下来我将用摸鱼一天为代价惩罚自己的努力!