力扣刷题:排序方式

100 阅读2分钟

前言:锻炼自己的思想,规范自己的编程思路。

问题:

给定一个数组 arr 和一个函数 fn,返回一个排序后的数组 sortedArr。你可以假设 fn 只返回数字,并且这些数字决定了 sortedArr 的排序顺序。sortedArr 必须按照 fn 的输出值 升序 排序。

你可以假设对于给定的数组,fn 不会返回重复的数字。

示例:(放代码里面)

输入:arr = [5, 4, 1, 2, 3], fn = (x) => x
输出:[1, 2, 3, 4, 5]
解释:fn 只是返回传入的数字,因此数组按升序排序。

思路:

这个题使用javascript的sort函数对数组中的元素进行排序。它接受一个可选的比较函数作为参数,用于确定数组中两个元素的顺序。如果没有提供比较函数,那么sort方法会按照字符编码的顺序对元素进行排序。

在这个问题中,我们需要根据 fn函数的返回值来确定两个元素的顺序。因此,我们可以定义一个比较函数,它接受两个参数a 和b,并返回fn(a) - fn(b) 的值。这样,当fn(a) 小于fn(b) 时,a 会排在b 前面;当fn(a) 等于 fn(b) 时,a 和 b 的顺序不变;当 fn(a) 大于 fn(b) 时,b 会排在a 前面。

我们使用 slice 方法来创建一个数组的副本,然后再对副本进行排序。这样,原始数组就不会被修改。

基于上述思考,代码如下:

/**
 * @param {Array} arr
 * @param {Function} fn
 * @return {Array}
 */
var sortBy = function sortArray(arr, fn) {
  return arr.slice().sort((a, b) => fn(a) - fn(b));
}

执行结果如下图: 击败100%的用户,撸啦啦噜啦啦噜啦噜啦啦

image-20230610144554169.png

学到知识点:

(1)使用 sort 方法来对数组进行排序。sort 方法接受一个比较函数作为参数,用于确定数组中两个元素的顺序。

(2)使用slice 方法来创建一个数组的副本,然后再对副本进行排序。这样,原始数组不会被修改。