前端面试手写题系列 I

前端手写题系列 I

前端面试 手写题系列 已经完结,包含了以下的题目:

1. 手写拍平数组 flat
2. 手写防抖和节流函数
3. 手写深拷贝
4. 手写快排
5. 手写 call、apply、bind
6. 手写一个 sleep 函数
7. 手写冒泡排序
8. 函数柯里化
9. 对象扁平化
10. 手写 new 过程
11. 求数组中的最大值
12. 手写 instanceof
13. 手写 foreach 函数
14. 手写迭代器
15. 手写 filter
16. 实现一个 compose 函数
17. 正则相关(去哪儿原题)
18. 实现一个任务调度函数(得物原题)
19. 数组转化为 tree
20. 不使用 a 标签,实现 a 标签的功能
21. 手写插入排序
22. LRU 算法
23. 归并排序
24. 求两个数组的交集、并集、补集、差集
25. 提取 url 中的参数
26. 实现一个洗牌函数 shuffle
27. 希尔排序

1.提取 url 中的参数

const url = 'https://lijiajun.xyz?a=1&b=2&c=3#1234'

方法一

const getUrlParams = (url) => {
  const arrSearch = url.split('?').pop().split('#').shift().split('&');
  let obj = {};
  arrSearch.forEach((item) => {
    const [k, v] = item.split('=');
    obj[k] = v;
  });
  return obj;
};

方法二

使用 JavaScript 提供的 api:

const getUrlParams = (url) => {
  const u = new URL(url);
  const s = new URLSearchParams(u.search);
  const obj = {};
  s.forEach((v, k) => (obj[k] = v));
  return obj;
};

2.实现一个洗牌函数 shuffle

洗牌算法的描述:洗牌是一种对有限序列进行洗牌的算法。该算法获取序列中所有元素的列表,并通过从列表中随机抽取元素来不断确定打乱序列中的下一个元素,直到没有元素为止。

方法一:使用 sort 函数

思路就是排序的时候比较一个随机数和 0.5 的大小,很明显每次比较随机生成的随机数都是既可能大于 0.5,也可能小于 0.5,所以每次比较的两个数字前后的顺序是不一定的,这就起到了洗牌的效果。

// shuffle 算法
function shuffle(list) {
	return list.sort((x, y) => Math.random() - 0.5)
}

// test
const list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
console.log(shuffle(list))

方法二

实现思路:
image.png
代码:

// shuffle 算法
function shuffle(list) {
	const len = list.length
	let result = [...list]
	for (let i = len - 1; i > 0; i--) {
		// [0 - 1) 之间的随机数 * (i + 1)
		// 比如 i = 9, [0 - 1) 之间的随机数 * 10 ,即 [0 - 10) 之间的随机数
		const swapIndex = Math.floor(Math.random() * (i + 1))
		// 交换位置
		;[result[i], result[swapIndex]] = [result[swapIndex], result[i]]
	}
	return result
}

// test
const list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
console.log(shuffle(list))

3.希尔排序

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。
希尔排序的目的就是为了加速插入排序的效率。
希尔排序的思路是:先将整个待排序的序列分割成为若干子序列,而后将它们分别进行直接插入排序。
[算法]六分钟彻底弄懂希尔排序,简单易懂_哔哩哔哩_bilibili

动画演示大概方法

具体例子体现思路

比如需要排序 [3, 1, 4, 2, 5, 7, 6]
image.png

代码

function shellSort(arr) {
	let len = arr.length
	let gap = Math.floor(len / 2)
	while (gap > 0) {
		for (let i = gap; i < len; i++) {
			let temp = arr[i]
			let j = i
			while (j >= gap && arr[j - gap] > temp) {
				arr[j] = arr[j - gap]
				j -= gap
			}
			arr[j] = temp
		}
		gap = Math.floor(gap / 2)
	}
	return arr
}

// test
let arr = [3, 1, 4, 2, 5, 7, 6]
console.log(shellSort(arr)) // [1, 2, 3, 4, 5, 6, 7]

为什么不直接插入排序呢?
使用希尔排序的比较次数和交换次数在数据量足够大的时候会明显减少,效率提高。

手写题系列文章

前端手写题系列 I
前端手写题系列 II
前端手写题系列 III
前端手写题系列 IV
前端手写题系列 V
前端手写题系列 VI
前端手写题系列 VII
前端手写题系列 VIII
前端手写题系列 IX
前端手写题系列 X

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

城南顾北

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值