【问题标题】:Another way to compare two values of an array List to find the lonely integer in Java?另一种比较数组列表的两个值以在 Java 中找到孤独整数的方法?
【发布时间】:2022-12-21 17:33:53
【问题描述】:

要解决的问题是在一个整数列表中找到一个不重复的整数。我使用 while 循环将每个值与另一个值进行比较。但是,该函数返回错误的值。这是一个 Hackerrank 挑战,可以在 here 找到。

public static int lonelyinteger(List<Integer> a) {

int lonelyInt = 0;
for (int i = 0; i < a.size(); i++) {
    for (int j=1;j<a.size();j++){
        while (a.get(i)!=a.get(j)){
            lonelyInt+=a.get(i);
            
        }
    }
}
return lonelyInt;
}

我真的很感激任何提示和/或更直接的解决方案。我是 Java 的新手,正在练习我的技能。

【问题讨论】:

  • 如果要求是查找列表的特定元素,为什么还要向 lonelyInt 添加值?
  • 为什么在这里使用 while 循环? lonelyInt 变量的用途是什么?
  • 我需要返回一个整数值,这就是为什么需要变量 lonelyInt 的原因。我使用 while 循环来确保 a.get(i) 不等于 a.get(j) 以获得不匹配的值其他。
  • 我会用一套。遍历数组,并为每个元素尝试将其添加到集合中。如果它没有被添加(因为它已经存在),请将其删除。当你到达数组的末尾时,集合中应该还剩下一个元素,这就是你要查找的整数。
  • 异或所有数字。它们要么出现一次,要么出现两次。出现两次的那些在异或运算中相互抵消,只剩下一个孤独的数字

标签: java computer-science


【解决方案1】:

您将每个数字与所有其他数字进行比较的方法原则上是正确的。

如果我们比较一世数组的第 th 个元素和所有其他元素,以及没有任何等于它,那么我们就知道它是唯一的数字。

您的程序没有正确执行此操作。

想想这样的循环:

  • 使用索引i 的外循环为我们提供了我们正在检查的数字a.get(i)
  • 使用索引j 的内部循环为我们提供了每个数字,以检查外部循环a.get(j) 选择的当前候选者。

因此,对于外循环的每次迭代,我们都需要跟踪内循环的任何迭代是否匹配。我们可以使用名为equalNumberFound 的本地boolean,我们在每次外循环迭代开始时将其设置为false

在内部循环中,我们检查是否找到了相等的数字,如果找到了,则将其设置为true。确保你没有检查一个数字本身!

在外循环的每次迭代结束时,我们检查equalNumberFound,如果它仍然是false,我们可以返回当前的外循环编号,因为我们现在知道没有其他数字是相等的。

您需要回顾一下您对 while 循环的了解,因为您似乎对它们的行为有一些错误的假设。

【讨论】:

    【解决方案2】:

    解决该问题的方法之一是首先对列表进行排序,然后将每个元素与其相邻元素进行比较,因为这些元素仅限于出现一次或两次。由于只有一个元素出现一次,那么没有相同相邻元素的元素就是停止条件。这种方法实现了 O(log(N)) 时间复杂度和 O(1) 空间复杂度。

    public static int lonelyInteger(List<Integer> a) {
        Collections.sort(a);
    
        for (int i = 1; i < a.size(); i += 2) {
            if (a.get(i - 1).intValue() != a.get(i).intValue()) return a.get(i - 1);
        }
        return a.get(a.size()-1);
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用哈希集。遍历整数列表:

      1. 如果哈希集中不存在整数,则将元素添加到哈希集中。
      2. 删除整数元素,如果它已经存在于哈希集中

        现在返回哈希集中唯一的非重复整数。

        public static int lonelyinteger(List<Integer> a) {
            
             Set<Integer> set = new HashSet<>();
                  
             for (int n : a) {        
                 if (set.contains(n)) {
                    set.remove(n);
                 } else {
                    set.add(n);
                 }        
             }
             return set.stream().findFirst().get();
        }
        

      【讨论】:

      • 您不需要使用contains。只需使用add。如果它添加了一些东西,它返回true,如果你添加的东西已经存在,它返回false
      【解决方案4】:

      不使用 Streams 的更好解决方案

      public static int lonelyinteger(List<Integer> a) {
          Set<Integer> s = new HashSet<>();
          for (int num : a) {
              if(!s.add(num)){
                  s.remove(num);
              }
          }
          return new ArrayList<>(s).get(0);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-14
        • 2013-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多