如何为N / 3重复号码修复此代码

时间:2019-06-11 09:36:22

标签: java

我正在面试中解决这个问题。

系统会为您提供n个整数的只读数组。找出是否有整数  以线性时间和常数在数组中出现n / 3次以上  额外的空间。

如果是,则返回整数。如果不是,则返回-1。

如果有多个解决方案,请退回任何一个。

  

示例:

     
      
  • 输入:[1 2 3 1 1]
  •   
  • 输出:1

         

    1次出现3次,超过5/3次。

  •   

这是我的代码,给出了错误的答案,任何人都可以纠正我在哪里错了。

public class Solution {
    // DO NOT MODIFY THE LIST
    public int repeatedNumber(final List<Integer> a) {
        int size =a.size();
        double c=size/3;
        int num=0;
        int n=0,m=1,l=size-1;
        double count=1;
        while(l>m && size>=3){
            if(a.get(n)==a.get(m) && a.get(n)!=a.get(l)){
                num=a.get(n);
                l--;
                count=count+1;
            }else if(a.get(n)==a.get(l) && a.get(n)!=a.get(m)){
                num=a.get(n);
                l--;
                count+=1;
            }else if(a.get(m)==a.get(l) && a.get(n)!=a.get(m)){
                num=a.get(m);
                l--;
                count+=1;
            }else if(a.get(n)==a.get(m)&& a.get(n)==a.get(l)){
                num=a.get(n);
                l--;
                if(count>0){
                    count+=1;
                }else{
                    count+=2;
                }
            }else{
                n++;
                m++;
                l--;
            }
        }
        if(count>1&& count>c){
            return num;
        }else{
            return -1;
        }
    }
}

A : [ 1000441, 1000441, 1000994 ]

Your function returned the following :

-1

期望的返回值:

任何出现次数超过n / 3次的数字

这是输出

2 个答案:

答案 0 :(得分:1)

您的代码有几个问题。

您目前遇到的主要问题是将Integer对象与==进行比较。 这将检查参考是否相同。他们似乎不是。 值是否相同并不重要,因为它仍然是两个不同的Integer对象(可能是List的“ fault”,因为您可以从技术上创建两个不同的Integer对象,这些对象将使用==评估为true运算符)。

正确执行此操作的最简单方法是使用以下任一方法:

a.intValue() == b.intValue()

a.equals(b)

后者效率较低,但是编写的代码较少。

我想提及的另一件事是

double c=size/3;

size是一个整数,3也是如此。因此,即使您的size中有5c也将是1.0

这是因为发生的第一件事将是5/3的计算(由于它们都是整数,因此它们将是1。然后,您将1分配给双精度变量,使其成为1.0。 如果您想实际获得正确的结果,则需要将这两个值之一转换为双精度值(除非在这种情况下您不需要它:为什么要完全使用double型?)

最后一件事: 目前的代码不适用于更复杂的示例。 但这是一个完全不同的问题,并且会导致“为您做功课”问题,所以我现在就不讨论了。一旦遇到其他问题,只需问一个新问题即可。

答案 1 :(得分:1)

要以linear的复杂度实现它,可以为此目的使用HashMap并保持maxCount,如果它大于n/3,则可以返回{{1 }}。 代码:

true

public boolean checkCount(int[] array, int n) { int maxCount = 0; Map<Integer,Integer> numberCountMap = new HashMap<>(); for(int i=0;i<array.length;i++){ int number = array[i]; int count = numberCountMap.getOrDefault(number,0); numberCountMap.put(number, ++count); if(count > maxCount){ maxCount = count; } } if(maxCount >= n/3){ return true; }else{ return false; } } 中,键为数组中的HashMap,其值为number。因此,最初它将检查它是否存在于its total count中,然后检查其值map。并将该值与increments进行比较。因此,最后如果maxCount大于或等于maxCount,则其为n/3,否则为true

  

因此对于输入数组:[1,2,1,4,6,1,1]它给出输出:true