# 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);
};