重生之摸鱼修仙传-偷摸刷算法(一)

71 阅读4分钟

🐟 你摸鱼我摸鱼,宗主宝马变青桔。
🐟 你摆烂我摆烂,宗主变成流浪汉。
🐟 你不干我不干,宗主明天捡破烂。

公元2024年7月1日,天气晴转阴转晴转多云

渔夫摸索着将手机闹铃按静音,翻了个身继续睡,虽然宗门是双休制度,但是一周工作的疲惫还未消去,新的一周又要开始了。

这是渔夫从灵界穿越到这个叫地球打工的第7个年头,但还是没有适应这种牛马生活。当闹铃从7点30响到8点,终于再不起床赚窝囊费就要饿死的渔夫终于扛不住了,1分钟起床,2分钟上厕所,3分钟洗脸刷牙洗头,4分钟穿衣服,剩下10分钟欣赏自己的绝世帅脸。妈的,我真他*的帅(作者感叹)🕶️。

终于9点30上班的渔夫在8点20分出门了,不要问为什么这么早出门,因为对宗门爱的深沉🤮

经过一个多小时的地铁蹂躏,在9点43分终于一屁股坐在了工位上,果不其然今天又迟到了。 渔夫不禁心里暗叹:要是还在灵界多好,老子一个御剑飞行,这点距离,眨眼就到了何必如此麻烦,凡人的世界就是烦人。

damn!

上周报了一个算法监督训练营,还交了一个月的饭钱(129rmb)当押金,按照规则必须得每天都要打卡刷算法题,然后要录视频,为了7月份不饿肚子必须得努力奋斗一下了,能提升自己真的好开心😭。

正好这周刚开始,宗门任务不多,先把这个副本下了。 今天的题目有三个:

ps:以下解法和思路都是个人见解,如有争议请以你的理解为准

两数之和

image.png

/**
 * @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;
        }
    }
};

思路:

  1. 拆解题目:需要输入两个参数【数组nums和target】,nums里的含有2个数值(A,B),A+B===target,将A,B的下标以数组的形式返回。
  2. 首先可以想到利用js中的map这个数据类型
  3. 创建map对象result,循环数组nums
  4. 在循环中,拿到当前的nums[i],并且计算与target的差(diff)
  5. 判断result中以diff为key的值是否为undefined,如果为undefined就以当前的nums[i]为key,i为值赋给result
  6. 如果diff不为undefined,就将i和result[diff]记录的index以数组的形式返回
  7. return

字母异位词分组

image.png

/**
 * @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());
};

思路:

  1. 拆解题目:理解字母异位词,题目最终目的是将含有相同字母的单词分组,最后以数组形式输出出来。
  2. 由于strs中的每一项的词语是不同的,那么先循环将每一项split再sort再join,再以map的对象将重新组合的字符串当成key,将源单词以数组的形式存储起来
  3. 循环到下一项重复第2步
  4. 最后将map对象以values方法输出
  5. return

最长连续序列

image.png

/**
 * @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. 拆解题目:本题是为了获取连续最长递增数字的最大长度,并且如果有重复的数字也不算断开
  2. 首先要想到,获取最大长度得先排序一下,这样才能判断当前项和后一项是否是+1的关系
  3. 其次要用Set数据类型去重,这样才能保证如果源数组有两个1的并且排序后不会判断为断开
  4. 再次要使用数组(result)去存储每次中断的长度
  5. 最后使用Math.max(...result)获取最大长度
  6. return

在这个过程中,渔夫发现对于Map的方法、Set的方法和Math的方法不甚熟练,还要去使用浏览器去查询,真是令人汗颜😓。等摸完鱼渔夫打算去恶补一下...

okkk,今天的工作先做这些吧,毕竟高楼不是一天建成的,接下来我将用摸鱼一天为代价惩罚自己的努力!

image.png