本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述
本题来自1313. 解压缩编码列表
二、思路分析
数组分成两部分,奇数项表示出现次数,偶数项表示展示的数值。
三、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)。