1313. 解压缩编码列表 | 刷题打卡

222 阅读1分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述

本题来自1313. 解压缩编码列表

image.png

二、思路分析

数组分成两部分,奇数项表示出现次数,偶数项表示展示的数值。

三、AC代码

我这有9种解法,依次是:

1.好理解 把数组按下标奇偶数分成两组 (i & 1) == 0 是判断奇偶数的装13写法,和(i % 2 == 0)一个意思

var decompressRLElist = function(nums) {
    let countArr = [], numArr = [], res = [];
    for(let i = 0; i < nums.length; i++) {
        if((i & 1) == 0) {
            countArr.push(nums[i]);
        } else {
            numArr.push(nums[i]);
        }
    }
    for(let j = 0; j < countArr.length; j++) {
        for(let k = 0; k < countArr[j]; k++) {
            res.push(numArr[j]);
        }
    }
    return res;
};

2.for+while for()中判断条件: i += 2至关重要

var decompressRLElist = function (nums) {
    list = []
    for (var i = 0; i < nums.length; i += 2) {
        while (nums[i]--) {
            list.push(nums[i + 1]);
        }
    }
    return list;
};

3.双层for循环

var decompressRLElist = function(nums) {
    list = []
    for(var i=0;i<nums.length;i+=2){
        for(var j=0;j<nums[i];j++){
            list.push(nums[i+1]);
        }
    }
    return list;
};

4.利用fill()

var decompressRLElist = function(nums) {
    let result = []
    for(let i = 0; i < nums.length / 2; i+=1) {
        result = [...result, ...new Array(nums[2*i]).fill(nums[2*i+1])]
    }
    return result;
};

5.还是fill()

var decompressRLElist = function(nums) {
    const ret = [];
    const len = nums.length;
    for(let i=0;i<len;i+=2){
        ret.push(...new Array(nums[i]).fill(nums[i+1]))
    }
    return ret;
};

6.嗯 还是fill()

var decompressRLElist = function(nums) {
    let arr = []
    for(let i = 0 ; i < (nums.length)/2 ; i++){
        arr = arr.concat(new Array(nums[2*i]).fill(nums[2*i+1]))
    }
    return arr
};

7.利用fill()、join()、split()

var decompressRLElist = function(nums) {
    let result = [];
    for (let i = 0; i < nums.length; i = i+2) {
        let transfer_arr = new Array(nums[i]);
        transfer_arr.fill(nums[i+1],0,transfer_arr.length);
        result.push(transfer_arr);
    }
    return result.join().split(',').map(function (value, index, array) {
        return +value;
    });
};

8.slice()

var decompressRLElist = function(nums) {
    let resultList = [];
    const total = nums.length / 2;
    for (let i = 0; i < total; i ++) {
        let [freq, val] = nums.slice(i * 2, i * 2 + 2);
        for (let j = 0; j < freq; j ++) {
            resultList.push(val);
        }
    }
    return resultList;
};

9.遍历元素,对2求模,映射一个新结对数组
对新结对数组再映射,map出数组长度和元素
打平展开

Array.prototype.flat = Array.prototype.flat || function() {
    return this.reduce((a,b) => a.concat(b))
}

var decompressRLElist = function(nums) {
    var arr = []
    nums.forEach((m,i) => {
        if(i%2===0){
            arr.push([m, nums[i+1]])
        }
    })
    arr = arr.map(m => Array(m[0]).fill(m[1]))
    return arr.flat()
};

四、总结

数组的方法好多~
简单的事情想做好也不容易~

本想20号之前参加14道题打卡活动,想要那个掘金小杯子,但是小弟实在不才,每做一道题+总结要用不少时间,最近还是想用时间做些别的我认为更重要的事情,打卡就先到这里了,过段时间再继续(淘宝自己买个小杯子安慰自己 o(>﹏<)o)。