【JavaScript笔试题】输入一个数组,找出重复出现过的数据,并进行排序输出

笔试题01:输入一个数组,找出重复出现过的数据,并进行排序输出

示例输入和输出

输入数组:[3, 1, 4, 2, 2, 5, 3, 3, 4, 6]
输出结果:[2, 3, 4]

1、使用 filter 方法实现

  1. 使用 filter 方法遍历数组,筛选出重复出现的元素
  2. 使用 indexOflastIndexOf 方法来判断元素是否在数组中出现多次
  3. 使用 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]
代码详解
  1. 过滤重复出现的元素:
    • 使用 filter 方法遍历数组中的每个元素
    • 对于每个元素,使用 indexOflastIndexOf 方法来判断它是否重复出现
    • arr.indexOf(item) !== index 判断当前元素是否是第一次出现
    • arr.lastIndexOf(item) === index 判断当前元素是否是最后一次出现
    • 这两个条件结合起来可以筛选出重复的元素
  2. 排序:
    • 使用 sort 方法对筛选出的重复元素进行排序
  3. 返回结果:
    • 返回排序后的重复元素数组
注意事项
  1. 性能考虑:filter 方法和 indexOflastIndexOf 方法的组合在较大数组上可能会有性能问题,因为这些方法会多次遍历数组。如果性能是一个关键问题,可以考虑使用更高效的数据结构,如 MapSet
  2. 扩展性考虑:如正整数检查,如果需要确保数组中只包含正整数,可以在过滤之前进行检查和过滤。
更高效的实现

为了提高性能,可以使用 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]
代码详解
  1. 统计每个元素的出现次数:
    • 使用 forEach 方法遍历数组中的每个元素。
    • 使用 Map 来记录每个元素的出现次数。如果 Map 中已经有该元素,则其计数加1;否则,将该元素的计数设置为1。
  2. 筛选出出现次数超过一次的元素:
    • 使用 MapforEach 方法遍历计数。
    • 如果某个元素的计数超过1,则将该元素添加到 duplicates 数组中。
  3. 排序:
    • 使用 sort 方法对筛选出的重复元素进行排序。
  4. 返回结果:
    • 返回排序后的重复元素数组。

这个实现方法确保了对所有元素进行统计,并准确找出和排序重复出现的元素。

结言

大家还有哪些更好的方法呢?欢迎评论区留言😊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值