笔试题01:输入一个数组,找出重复出现过的数据,并进行排序输出
示例输入和输出
输入数组:[3, 1, 4, 2, 2, 5, 3, 3, 4, 6]
输出结果:[2, 3, 4]
1、使用 filter
方法实现
- 使用
filter
方法遍历数组,筛选出重复出现的元素 - 使用
indexOf
和lastIndexOf
方法来判断元素是否在数组中出现多次 - 使用
sort
方法对筛选出的元素进行排序
示例代码
function findAndSortDuplicates(arr) {
// 过滤出数组中重复出现的元素
const duplicates = arr.filter((item, index) => arr.indexOf(item) !== index && arr.lastIndexOf(item) === index);
// 对重复的元素进行排序
duplicates.sort((a, b) => a - b);
return duplicates;
}
// 示例用法
const array = [3, 1, 4, 2, 2, 5, 3, 3, 4, 6];
const result = findAndSortDuplicates(array);
console.log(result); // 输出: [2, 3, 4]
代码详解
- 过滤重复出现的元素:
- 使用
filter
方法遍历数组中的每个元素 - 对于每个元素,使用
indexOf
和lastIndexOf
方法来判断它是否重复出现 arr.indexOf(item) !== index
判断当前元素是否是第一次出现arr.lastIndexOf(item) === index
判断当前元素是否是最后一次出现- 这两个条件结合起来可以筛选出重复的元素
- 使用
- 排序:
- 使用
sort
方法对筛选出的重复元素进行排序
- 使用
- 返回结果:
- 返回排序后的重复元素数组
注意事项
- 性能考虑:
filter
方法和indexOf
、lastIndexOf
方法的组合在较大数组上可能会有性能问题,因为这些方法会多次遍历数组。如果性能是一个关键问题,可以考虑使用更高效的数据结构,如Map
或Set
。 - 扩展性考虑:如正整数检查,如果需要确保数组中只包含正整数,可以在过滤之前进行检查和过滤。
更高效的实现
为了提高性能,可以使用 Map
来记录每个元素的出现次数,然后筛选出重复出现的元素。以下是一个更高效的实现方法:
2、使用 Map
实现 【推荐】
示例代码
function findAndSortDuplicates(arr) {
const countMap = new Map();
const duplicates = [];
// 统计每个元素的出现次数
arr.forEach(num => {
// TODO 这里可以添加一些条件检查,如正整数检查if (item > 0) { ... };
countMap.set(num, (countMap.get(num) || 0) + 1);
});
// 筛选出出现次数超过一次的元素
countMap.forEach((count, num) => {
if (count > 1) {
duplicates.push(num);
}
});
// 对筛选出的元素进行排序
duplicates.sort((a, b) => a - b);
return duplicates;
}
// 示例用法
const array = [3, 1, 4, 2, 2, 5, 3, 3, 4, 6];
const result = findAndSortDuplicates(array);
console.log(result); // 输出: [2, 3, 4]
代码详解
- 统计每个元素的出现次数:
- 使用
forEach
方法遍历数组中的每个元素。 - 使用
Map
来记录每个元素的出现次数。如果Map
中已经有该元素,则其计数加1;否则,将该元素的计数设置为1。
- 使用
- 筛选出出现次数超过一次的元素:
- 使用
Map
的forEach
方法遍历计数。 - 如果某个元素的计数超过1,则将该元素添加到 duplicates 数组中。
- 使用
- 排序:
- 使用
sort
方法对筛选出的重复元素进行排序。
- 使用
- 返回结果:
- 返回排序后的重复元素数组。
这个实现方法确保了对所有元素进行统计,并准确找出和排序重复出现的元素。
结言
大家还有哪些更好的方法呢?欢迎评论区留言😊