# 06. 常见算法题
# 1. 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
# 代码实现
var twoSum = function (nums, target) {
let map = new Map();
for (let i = 0; i < nums.length; i++) {
let res = target - nums[i];
// 判断目标值是否存在。
if (map.has(res)) return [map.get(res), i];
// 不存在添加。
map.set(nums[i], i);
};
};
# 复杂度分析
时间复杂度:O(N)。
空间复杂度:O(N)。
# 2. 数字分割为字符串
实现splitArray函数:
# 示例:
console.log(splitArray(1, 10, 2)); //[ '1', '3-10' ]
console.log(splitArray(1, 10, 5)); //[ '1-4', '6-10' ]
console.log(splitArray(1, 10, 7)); //[ '1-6', '8-10' ]
console.log(splitArray(1, 10, 10)); //[ '1-9' ]
console.log(splitArray(1, 10, 9)); //[ '1-8', '10' ]
console.log(splitArray(1, 10, 0)); //[ '1-10' ]
console.log(splitArray(1, 10, 1)); //[ '2-10' ]
# 代码实现
function splitArray(start, end, num) {
let res = [];
if (num - 1 >= start) {
res.push([...new Set([start, num - 1])].join('-'));
};
if (end >= num + 1) {
res.push([...new Set([num + 1, end])].join('-'));
};
return res;
};
# 3. 解析url参数
解析url地址参数,注意数字字符串格式转换。
# 示例:
let str = "http://www.baidu.com/?a=1&b=5,6,7&c=9";
let str1 = "http://www.baidu.com/?a=1&b=5,6,7,e&c=9";
console.log(getParams(str)) //{ a: [ 1 ], b: [ 5, 6, 7 ], c: [ 9 ] }
console.log(getParams(str1)) //{ a: [ 1 ], b: [ 5, 6, 7, 'e' ], c: [ 9 ] }
# 代码实现
function getParam(url) {
let arr = url.slice(url.indexOf('?') + 1).split('&');
let obj = {};
// 遍历。
arr.forEach(item => {
let key = item.split('=')[0];
let values = item.split('=')[1].split(',');
for (let i = 0; i < values.length; i++) {
// 数字格式转换。
!Number.isNaN(values[i] * 1) ? values[i] = values[i] * 1 : '';
};
obj[key] = values;
});
return obj;
};
# 4. 一维数组转多维数组
根据 dim 参数,将原数组分割成每个元素为 dim 个元素的多维数组:
# 示例:
console.log(oneToManyDimension(data, 3));
//[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ], [ 10 ] ]
# 代码实现
function oneToManyDimension(data, dim) {
// 边界判断。
if (dim > 0 && dim <= data.length) {
let res = [], start = 0, end = start + dim;
// 循环截取数组添加,并重新赋值。
while (start <= data.length) {
let result = data.slice(start, end);
result.length > 0 ? res.push(result) : '';
start = end;
end = start + dim;
};
return res;
};
};
# 5. 多维数组转一维数组
# 示例:
let arr = [1, 2, [3, 4, [5, 6, [7, 8]]]];
console.log(arrayDepth(arr, 0)); //[1, 2, [3, 4, [5, 6, [7, 8]]]];
console.log(arrayDepth(arr, 1)); //[1, 2, 3, 4, [5, 6, [7, 8]]];
console.log(arrayDepth(arr, 2)); //[1, 2, 3, 4, 5, 6, [7, 8]];
console.log(arrayDepth(arr, 3)); //[1, 2, 3, 4, 5, 6, 7, 8];
console.log(arrayDepth(arr, 5)); //[1, 2, 3, 4, 5, 6, 7, 8];
console.log(arrayDepth(arr, -1)); //[1, 2, [3, 4, [5, 6, [7, 8]]]];
# 代码实现
function arrayDepth(arr, dim) {
if (dim <= 0) return arr;
return arr.reduce((prev, current) => {
return Array.isArray(current) ? [...prev, ...arrayDepth(current, dim - 1)] : [...prev, current];
}, []);
};
# 6. 时间格式化
# 示例:
// 时间格式化。
dateFormat(date, 'yyyy'); //2022
dateFormat(date, 'yyyy-MM'); //2022-10
dateFormat(date, 'yyyy/MM'); //2022/10
dateFormat(date, 'yyyy.MM'); //2022.10
dateFormat(date, 'yyyy-MM-dd'); //2022-10-15
dateFormat(date, 'yyyy-MM-dd HH'); //2022-10-15 10
dateFormat(date, 'yyyy-MM-dd HH:mm'); //2022-10-15 10:35
dateFormat(date, 'yyyy-MM-dd HH:mm:ss'); //2022-10-15 10:35:40
dateFormat(date, 'yyyy-MM-dd HH:mm:ss.SSS'); //2022-10-15 10:35:40.309
# 代码实现
function dateFormat(date, format) {
// 时间格式化。
let newDate = new Date(date);
// 判断。
if (!format) return date;
// 补零。
const setTime = (time) => time >= 10 ? time : '0' + time;
// 遍历,字符串替换。
return format.split(/[-|/| |:|.]/).reduce((prev, current) => {
switch (current) {
case 'yyyy':
prev = prev.replace(current, newDate.getFullYear());
break;
case 'MM':
prev = prev.replace(current, setTime(newDate.getMonth() + 1));
break;
case 'dd':
prev = prev.replace(current, setTime(newDate.getDate()));
break;
case 'HH':
prev = prev.replace(current, setTime(newDate.getHours()));
break;
case 'mm':
prev = prev.replace(current, setTime(newDate.getMinutes()));
break;
case 'ss':
prev = prev.replace(current, setTime(newDate.getSeconds()));
break;
case 'SSS':
prev = prev.replace(current, newDate.getMilliseconds());
break;
};
return prev;
}, format);
};