常见算法题(一)
(1) 用二维数组 matrix 代表一个正方形矩形阵,设计一个算法返回矩阵对角线元素的和。需要注意: 对角线交点的值只计算一次。
举例1.
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
举例2.
const matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
];
求和方法实现
const sumMatDiagonalODR = (matrix) => {
try {
const oddEvenArray = matrix.length % 2 === 0;
let num = 0
for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix[i].length; j++) {
if(i === j) {
num += matrix[i][j];
if(!oddEvenArray && Math.floor(matrix.length / 2) === i) {
continue;
}
}
if(matrix.length - 1 - i === j) {
num += matrix[i][j];
}
}
}
console.log('num', num);
return num;
} catch(err) {
console.log(err);
}
};
const sumMatDiagonalOPT = (matrix) => {
try {
let num = 0;
for (let i = 0; i < matrix.length; i++) {
num += matrix[i][i] + matrix[i].at(-1 - i);
}
if (matrix.length % 2 !== 0) {
const index = Math.floor(matrix.length / 2);
num -= matrix[index][index];
}
console.log('num', num);
} catch(err) {
console.log(err);
}
}
const sumMatDiagonalOPL = (matrix, num = 0) => !matrix.forEach((item, i) => num += matrix[i][i] + matrix[i].at(-1 - i)) && (matrix.length % 2 !== 0 ? (num -= matrix[Math.floor(matrix.length / 2)][Math.floor(matrix.length / 2)]) : num);
(2) 有数组arr,由不同整数组成,升序排列数组,,设计一个程序,满足返回arr[i] = i 的最小索引 i,没有的话返回-1。
举例1.
const arr = [1, 2, 2, 5, 4, 3];
arr === [1, 2, 2, 3, 4, 5];
arr[2] === 2, 返回 2
举例2.
const arr = [8, 48, 1365, 899, 34, 344, 2];
arr === [2, 8, 34, 48, 344, 899, 1365];
以上不满足 arr[i] === i,返回 -1
实现
const fiexdPointOne = (arr, num = -1) => {
arr.sort((a, b) => a - b);
for (let j = 0; j < arr.length; j++) {
if(arr[j] === j) {
return num = j;
}
}
return num
}
const fiexdPointTwo = (arr) => arr.sort((a, b) => a - b).findIndex((e, i) => i === e);
const arr = [4, 8, 7, 3, 9, 5, 6, 19, 8, 25, 28, 11, 99, 26, 38, 1, 2];
console.log(fiexdPointOne(arr));
console.log(fiexdPointTwo(arr));
(3) 判断字符串是否为回文串
举例1.
const str1 = 'abcdedg';
const str2 = 'abcdcba';
str1从左往右读与从右往左读不一致,故不是回文串。
str2从左往右读与从右往左读一致,是回文串。
实现
const testPDString = (str, boolean = true) => {
if (typeof str !== 'string') return alert('请入参字符串');
if (str.length <= 1) return boolean;
for (let i = 0; i < Math.floor(str.length / 2); i++) {
if (str[i] !== str.at(-1 - i)) {
return boolean = false;
}
}
return boolean;
}
console.log(testPDString('abcdefg', boolean));
console.log(testPDString('abcdcba', boolean));
console.log(testPDString('abcddcba', boolean));
const PDString = (str) => typeof str === 'string' ? !str.split('').some((ele, i) => ele !== str.at(-1 - i)) : alert('请入参字符串');
console.log(PDString('abcdefg'));
console.log(PDString('abcdcba'));
console.log(PDString('abcddcba'));
(4) 扁平化数组并升序排序
举例1.
const arr = [2, 9, 13, [6, 8, 8, [223, 688, 725]], [34, 101, 555]];
arr === [2, 6, 8, 8, 9, 13, 34, 101, 233, 555, 688, 725];
实现
const deconstructArr = (arr) => {
return arr.flat(Infinity);
const len = arr.length;
let newArr = [];
for (let i = 0; i < len; i++) {
if (Array.isArray(arr[i])) {
newArr = [...newArr, ...deconstructArr(arr[i])]
} else {
newArr.push(arr[i]);
}
}
return newArr;
}
const bubblingSort = (arr) => {
if (!Array.isArray(arr)) return;
const newArr = deconstructArr(arr);
const length = newArr.length;
let num;
for (let i = 0; i < length - 1; i++) {
for(let j = 0; j < length; j++) {
if (+newArr[j] > +newArr[j + 1]) {
num = newArr[j];
newArr[j] = newArr[j + 1];
newArr[j + 1] = num;
}
}
}
return newArr
}
const pushSort = (arr) => {
if (!Array.isArray(arr)) return;
const newArr = deconstructArr(arr);
const newArr = [Arr[0]];
let num;
for (let i = 1; i < Arr.length; i++) {
newArr.push(Arr[i]);
for (let j = newArr.length - 1; j > 0; j--) {
if (+newArr[j] < +newArr[j - 1] ) {
num = newArr[j];
newArr[j] = newArr[j - 1];
newArr[j - 1] = num;
}
}
}
return newArr;
}
const APIArraySort = (arr) => {
if (!Array.isArray(arr)) return;
return deconstructArr(arr).sort((a, b) => a - b);
}
const array = [[1, 4, 5, 9, 10, [646, 49, 46, 32, 89, 110], {a: 14, b: 'abc'}], [14,24,45,59,160]];
console.log(bubblingSort(array));
console.log(pushSort(array));
console.log(APIArraySort(array));
(5) n个一组翻转数组
- 给你一个数组,每n个元素为一组进行翻转,返回翻转后的数组
- n是个正整数,它小于数组长度;如果n不是数组长度的因数,请将最后剩余的元素保持原有顺序
举例1.
const arr = [10, 20, 30, 40, 50, 60, 70]
arr === [20, 10, 40, 30, 60, 50, 70]
arr === [30, 20, 10, 60, 50, 40, 70]
实现
const reverseArrBatchFlip = (arr, n) => {
const handleArrEle = (arr, n, i) => {
n--;
let index = i + n / 2;
let last = i + n;
let step = 0;
for (let j = i; j < index; j++, step++) {
let ele = arr[j];
arr[j] = arr[last - step];
arr[last - step] = ele;
}
};
const newArr = [...arr];
for (let i = 0; i < newArr.length; i++) {
if (i % n === 0 && i + n < newArr.length || i === 0) {
handleArrEle(newArr, n, i);
}
}
return newArr;
};
reverseArrBatchFlip(arr, 4);
reverseArrBatchFlip(arr, 5);
reverseArrBatchFlip(arr, 6);
reverseArrBatchFlip(arr, 7);