前端面试手写题系列 IX

前端面试手写题系列 IX

1.手写深拷贝

image.png

定义:

什么是深拷贝:拷贝的是对象
image.png
image.png
什么是浅拷贝:拷贝的是引用
image.png

实现:

我们有两种方式实现深拷贝:

// 手写深拷贝
// 1. 使用 JSON.parse(JSON.stringify(obj)) 但是这种方法有局限性,不能拷贝函数
function deepClone(obj) {
	return JSON.parse(JSON.stringify(obj))
}

// 2. 使用递归,可以实现真正意义上的深拷贝
function deepClone1(obj) {
	if (typeof obj !== 'object') return obj
	// 判断是数组还是对象
	let res = obj instanceof Array ? [] : {}
	for (let key in obj) {
		// 判断是否是自身属性,如果不是自身属性,就不需要拷贝
		if (obj.hasOwnProperty(key)) {
			res[key] = deepClone1(obj[key])
		}
	}
	return res
}

// 测试
let obj = {
	name: 'zhangsan',
	age: 18,
	hobby: ['eat', 'sleep', 'play'],
	home: {
		city: 'beijing',
		province: 'beijing'
	},
	say: function () {
		console.log('hello')
	}
}

let objClone = deepClone(obj)
let objClone1 = deepClone1(obj)

// 分别看看结果
console.log(objClone)
console.log(objClone1)

结果:
image.png

2.手写快排

什么是快速排序:

快速排序的最坏时间复杂度:
O(nlogn),最坏为 O(n^2)
最坏的情况是每次选取的元素都是最大值或者最小值。

实现思路:

每次选取一个值作为基准,然后将比他小的放在他的左边,比他大的放在他的右边,如此循环。

// 手写快速排序
function quickSort(arr) {
	if (arr.length < 2) {
		return arr
	}
	// 选取基准值,我们一般选取数组的中间值,此时就可以将数组分为左右两份
	let mid = Math.floor(arr.length / 2)
	let temp = arr.splice(mid, 1)[0]
	// 我们将比这个值小的放在左边,比这个值大的放在右边
	let left = []
	let right = []

	for (let i = 0; i < arr.length; i++) {
		if (arr[i] < temp) {
			left.push(arr[i])
		} else {
			right.push(arr[i])
		}
	}

  // 实际上这里是由一个递归调用的
	return [...quickSort(left), temp, ...quickSort(right)]
}

// 测试
let arr = [1, 3, 2, 5, 4, 6, 9, 8, 7]
console.log(quickSort(arr))

image.png
结果:

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

城南顾北

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

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

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

打赏作者

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

抵扣说明:

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

余额充值