我正在面试中解决这个问题。
系统会为您提供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次的数字
这是输出
答案 0 :(得分:1)
您的代码有几个问题。
您目前遇到的主要问题是将Integer对象与==
进行比较。
这将检查参考是否相同。他们似乎不是。
值是否相同并不重要,因为它仍然是两个不同的Integer对象(可能是List的“ fault”,因为您可以从技术上创建两个不同的Integer对象,这些对象将使用==
评估为true运算符)。
正确执行此操作的最简单方法是使用以下任一方法:
a.intValue() == b.intValue()
或
a.equals(b)
后者效率较低,但是编写的代码较少。
我想提及的另一件事是
double c=size/3;
size
是一个整数,3
也是如此。因此,即使您的size
中有5
,c
也将是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