十几道前端基础算法题目,你都会了吗?

下面涉及到一些关于数组以及对象的一些基础算法题目,你会几种?

题目 1:生成从 0 到指定值的数字数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 1. 生成从0到指定值的数字数组
*
* */
// 方法1:
const genArr = (startNum, endNum) => {
let arr = [];
for (i = startNum; i <= endNum; i++) {
arr.push(i);
}
return arr;
};

console.log("1.生成从0到指定值的数字数组:", genArr(0, 4));

// 方法2:
const genArrByArrayFrom = (len) => {
return Array.from({ length: len }, (v, i) => i);
};
console.log("1.生成从0到指定值的数字数组:", genArrByArrayFrom(5));

题目 2:获取数组的最大值,最小值相关

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 2. 获取数组的最大值,最小值相关
*
* */
const getArrMaxVal = (arr) => {
return Math.max(...arr);
};
console.log("2.获取数组的最大值:", getArrMaxVal([1, 9, 3, 4, 5]));

const getArrMinVal = (arr) => {
return Math.min(...arr);
};
console.log("3.获取数组的最小值:", getArrMinVal([1, 9, 3, 4, 5]));

题目 3:数组去重

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 方法1:
const removeEqual = (arr) => {
const result = arr.filter((item, index, self) => {
return self.indexOf(item) === index;
});
return result;
};

console.log("3.数组去重", removeEqual([1, 3, 3, 1, 4, 5]));
// 方法2:
const removeEqualSuper = (arr) => {
const setArr = new Set(arr);
const result = Array.from(setArr);
return result;
};
console.log("3.数组去重", removeEqualSuper([1, 3, 3, 1, 4, 5]));

题目 4:斐波拉数列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 5. 斐波拉数列,又称黄金分割数列.
* 指的是一个数列:0,1,1,2,3,5,8,13,21,34,....
* 在数学上,斐波拉 数列以如下被递推的方法定义:
* F(0)= 0,F(1)=1,F(n)= F(n-1)+F(n-2)
* */

const generateFib = (n) => {
let fibArr = [];
let i = 0;
while (i < n) {
if (i <= 1) {
fibArr.push(i);
} else {
fibArr.push(fibArr[i - 1] + fibArr[i - 2]);
}
i++;
}
return fibArr;
};
console.log("5.斐波拉数列", generateFib(8));

题目 5:求斐波拉数列的第 N 项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 递归方法:
const fib = (num) => {
if (num < 2) {
return num;
}
return fib(num - 1) + fib(num - 2);
};

console.log("6.递归方法求斐波拉数列第8项", fib(10));

// 动态规划
const fibSuper = (item) => {
if (item < 2) {
return item;
}
const numArr = [0, 1];
for (let i = 2; i <= item; i++) {
numArr.push(numArr[0] + numArr[1]);
// console.log('result', numArr);
numArr.splice(0, 1);
}
return numArr[1];
};
console.log("6.动态规划方法求斐波拉数列第8项", fibSuper(50));

题目 6:找出下列正整数的最大差值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* 找出下列正整数的最大差值
* [10,5,11,7,8,9]
* 输出 6
* */
const getaxProfit = (arr) => {
let maxProfit = 0;
let minVal = arr[0];

for (var i = 0; i < arr.length; i++) {
const currentVal = arr[i];
minVal = Math.min(minVal, currentVal);
const temp = currentVal - minVal;
maxProfit = Math.max(maxProfit, temp);
}
return maxProfit;
};

console.log("7.找出数组项的最大差值,方法1:", getaxProfit([10, 5, 11, 7, 8, 9]));

const getaxProfit2 = (arr) => {
return Math.max(...arr) - Math.min(...arr);
};
console.log(
"7.找出数组项的最大差值,方法2:",
getaxProfit2([10, 5, 11, 7, 8, 9])
);

const getaxProfit3 = (arr) => {
let carr = [...arr].sort((a, b) => a - b);
return carr[carr.length - 1] - carr[0];
};
console.log(
"7.找出数组项的最大差值,方法3:",
getaxProfit3([10, 5, 11, 7, 8, 9])
);

题目 7:数组的冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const bubbleSort = (arr) => {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length - i; j++) {
if (arr[j + 1] < arr[j]) {
let temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
};

console.log("7.冒泡排序:", bubbleSort([10, 5, 11, 7, 8, 9]));

题目 8:数组的交集

1
2
3
4
5
6
const intersectionFn = (arr1, arr2) => {
const result = arr1.filter((item1) => arr2.some((item2) => item1 === item2));
return result;
};

console.log("9.数组交集:", intersectionFn([1, 2, 3], [2, 3, 4, 5, 6]));

题目 9:数组的补集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 10. 数组的补集
* arrOne 在 arrTwo 中的相对补集是这样一个集合
* 某元素属于arrTwo 但不属于arrOne.
* const arrOne = [1,2,3];
* const arrTwo = [2,3,4,5,6];
* */

const complementFn = (arr1, arr2) => {
const result = arr2.filter((item2) => arr1.every((item1) => item1 !== item2));
return result;
};

console.log("9.数组补集:", complementFn([1, 2, 3], [2, 3, 4, 5, 6]));

题目 10:数组的并集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 11. 数组的并集
* const arrOne = [1,2,3];
* const arrTwo = [2,3,4,5,6];
* */

const unionFn = (arr1, arr2) => {
const result = arr1.concat(
arr2.filter((item2) => arr1.every((item1) => item1 !== item2))
);
return result;
};

console.log("11.数组并集:", unionFn([1, 2, 3], [2, 3, 4, 5, 6]));

题目 11:数据结构转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 12. 有以下数据结构
* const data = [
* {key:'name',value:'tom'},
* {key:'age',value:11}
* ]
* 实现一个函数processFn根据对应的key,value生成对象
* const res = {
* name:'tom',
* age:1
* }
* */

const processFn = (data) => {
const result = {};
for (let i = 0; i < data.length; i++) {
const { key, value } = data[i];
result[key] = value;
}
return result;
};

const data = [
{ key: "name", value: "tom" },
{ key: "age", value: 11 },
];

console.log("12.数据加工:", processFn(data));

题目 12:数组求和

1
2
3
4
5
6
7
8
9
10
11
/**
* 12. 数组求和
* [1,2,3,4,5]
* */
const arrSum = (arr) => {
const temp = arr.reduce((prev, now) => {
return prev + now;
}, 0);
return temp;
};
console.log("13.数组求和:", arrSum([1, 2, 3, 4, 5]));

控制台测试对比图