当前位置: 首页 > 知识库问答 >
问题:

在数组中找到重复数字的问题,我的技术不好吗?

袁宜
2023-03-14

我使用HashMap来存储每个元素的出现,然后遍历哈希图以获取重复的元素,但这个解决方案感觉不太对劲。

Firecode.io中的问题陈述:

编写一个方法duplicate来查找数组中重复的元素。该方法应该返回一个字符串中重复整数的列表,其中的元素按升序排序(如下所示)。

重复({1,3,4,2,1})--

重复({1,3,4,2,1,2,4})--

注意:您可以使用 toString() 方法返回大多数数据结构的标准字符串表示形式,并使用 Arrays.sort() 对结果进行排序。

这是我的代码:

 public String duplicate(int[] numbers) {
      HashMap < Integer, Integer > hs = new HashMap < Integer, Integer > ();
      for (int i = 0; i < numbers.length; i++) {
           if (hs.get(numbers[i]) == null) {
                hs.put(numbers[i], 1);
           } else hs.put(numbers[i], (Integer) hs.get(numbers[i]) + 1);
      }

      int size = 0;
      for (int i: hs.keySet()) {
           if (hs.get(i) > 1) {
                size++;
           }
      }
      int j = 0;
      int[] a = new int[size];
      for (int i: hs.keySet()) {
           if (hs.get(i) > 1) {
                a[j++] = i;
           }
      }

      Arrays.sort(a);
      return Arrays.toString(a);
 }

共有3个答案

梅欣然
2023-03-14

如果您使用的是Java 8或更高版本,您可以尝试:

public String duplicate(int[] numbers) {
    Map<Integer, Integer> hs = new HashMap<>();
    for ( int i : numbers ) {
        hs.merge( i, 1, Integer::sum);
    }
    return '[' + 
             hs.entrySet()
               .stream()
               .filter( e -> e.getValue() > 1 )
               .map(Entry::getKey)
               .sorted()
               .map(i -> i.toString())
               .collect(Collectors.joining(", ")) +
           ']';
}
王宜
2023-03-14

由于您不必知道元素重复的次数,因此只需要一个 Set 来记住哪些元素是唯一的,哪些不是。如果您知道元素值(例如,介于 1 和 10 之间的数字),则可以进一步简化 Set to boolean[] 或位向量:

int[] numbers = {1, 3, 4, 2, 2, 1, 2, 4, 4};
Set<Integer> unique = new HashSet<>();
Set<Integer> duplicates = new HashSet<>();
for (int n : numbers) {
    if (!unique.add(n)) {
        duplicates.add(n);
    }
}
List<Integer> result = new ArrayList<>(duplicates);
result.sort(Integer::compareTo);
System.out.println(result); // [1, 2, 4]
空正豪
2023-03-14

以下是我的做法:(出于教育目的的注释,可能不会在生产代码中包含它们。

public String duplicate(int[] numbers) {

  // holds the items we've encountered more than once.
  // TreeSet<> keeps things in sorted order for us.
  final SortedSet<Integer> duplicates = new TreeSet<>();

  // keeps track of items we've encountered.
  final Set<Integer> encountered = new HashSet<>(); 

  // iterate over every number
  for (final int number : numbers) {
    // Add the item to encountered. Set.add() will return true if 
    // the element is new to the set.
    if (!encountered.add(number)) {
       // Since the element wasn't new, ensure this item exists in the duplicates collection.
       duplicates.add(number);
    }
  }

  return duplicates.toString();
}
 类似资料:
  • 我有一个包含HTML元素的数组(我用)填充了它,我试图在该数组中查找元素的索引,但控制台给出了错误: 未捕获的TypeError:rows.indexOf不是函数 我用它来填充数组所需的HTML元素: 值得注意的是,这些元素是用javascript生成的,然后使用放入数组中。如果要检查整个过程,这里有一个jsfiddle

  • 题目链接 牛客网 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 // html Input: {2, 3, 1, 0, 2, 5} Output: 2 解题思路 要求时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标

  • 问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: 错误:找不到vcvarsall.bat 我正在尝试为python安装MySql接口,但出现错误(如下所述)。我知道解决方案:安装Microsoft Visual C 。除了安装Microsoft Visual C ,还有其他解决方案吗?我的意思是这真的伤害了我。我为什么要安装Microsoft Visual C ++仅仅是因为构

  • 一、题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 举例说明 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。 二、解题思路 解决这个问题的一个简单的方法是先把输入的数组排序。从排序的数组中找出重复的数字时间很容易的事情,只需

  • 好的,所以我查询DB并从IP地址列表生成一个数组: 返回的数组看起来像这样: 但是如果我想找到上面列表中的第一个或任何IP,出于某种原因,它什么也找不到: 我到底做错了什么?

  • 我在一个名为course的模式中有一个名为students的数我创建了一个路由,允许我使用学生的将学生添加到这个数组中,如下所示: 当我尝试用以下JSON体向我的endpoint发出PUT请求时: 谢谢!