我正在尝试编写一个方法来查找数组中的重复值,并在发生两次时返回true(否则返回false)。
我有一些东西,但由于某种原因,它在某种情况下无法正常工作:
public static boolean twoDuplicates(int[] values) {
boolean twoDuplicate = false;
int counter = 0;
for(int i = 0; i < values.length; i++){
for(int z = i + 1; z <= values.length - 1; z++){
if(i != z && values[i] == values[z])
counter++;
}
}
if(counter == 2)
twoDuplicate = true;
return twoDuplicate;
}
现在,我测试了它,当值为[3,3,3,6,6]时它不起作用。有原因吗?
编辑:我忘了提到副本必须与众不同。
答案 0 :(得分:1)
看起来你只是计算比赛的总数。即你将匹配3次(计数器= 3现在)和z一次匹配总共4次。 当我用数组运行这段代码时,我得到counter = 4;
我认为以下代码将返回不同重复项的数量(带有重复的数字,无论它出现多少次)。这将为测试阵列返回2。它首先对数组进行排序,然后查找重复项,忽略已经计数的重复项。
public static boolean twoDuplicates(int[] values) {
boolean twoDuplicate = false;
int counter = 0;
Arrays.sort(values);
int old = values[0];
boolean numberSeen = false;
for(int i = 0; i < values.length; i++){
if(values[i] == old){
if(!numberSeen){
counter++;
numberSeen = true;
}
}else{
numberSeen = false;
old = values[i];
}
}
if(counter == 2)
twoDuplicate = true;
return twoDuplicate;
}
答案 1 :(得分:1)
在现有代码中,您计算的是对数,而不是查找重复数。 您应该为每个'i'单独检查计数器。
public static boolean twoDuplicates(int[] values) {
boolean twoDuplicate = false;
for(int i = 0; i < values.length; i++){
int counter = 0;
for(int z = i + 1; z <= values.length - 1; z++){
if(i != z && values[i] == values[z])
counter++;
}
if(counter == 2) // or if(counter > 1) if finding three duplicates is also fine
return true;
}
return false;
}
或
public static boolean twoDuplicates(int[] values)
{
for(int i = 0; i < values.length; i++)
{
int counter = 0;
for(int z = i + 1; z <= values.length - 1; z++)
{
if(values[i] == values[z])
{
counter++;
if(counter == 2) // check here if you want 2 or more duplicates
return true;
}
}
// check here if you want exactly two duplicates
}
return false;
}
答案 2 :(得分:0)
根据你的逻辑,如果你有两个以上的重复,该函数将返回false,也许你应该使用“counter&gt; 1”进行判断,并且计数器定义应该放在外部迭代中。我认为算法不够聪明。
答案 3 :(得分:0)
情况就是这样:
第一个循环首先读取3.第二个循环读取第二个和第三个3s。柜台变为2。 第一个循环读取第二个3.第二个循环读取第三个3.计数器变为3 第一个循环读取第三个3.第二个循环找不到任何东西。柜台是3。 第一个循环首先读取6.第二个循环读取第二个6.计数器为4。 第一个循环读取第二个6.第二个循环找不到任何东西。柜台是4。
您需要做的是在第二次循环后放置if( counter == 2 )
。这将解决您的问题。
if( counter == 2 ) return true;
答案 4 :(得分:0)
1。您需要记住找到的第一个重复对的值。
否则,连续3,3,3行 - 你会发现3次两次。 所以存储第一个重复值并比较不是它。
int firstDuplicate;
if(i != z && values[i] == values[z]) {
if (counter == 0) {
counter++;
firstDuplicate = values[i];
} else if (counter == 1 && values[i] != firstDuplicate) {
counter++;
}
}
2。 z <= values.length - 1
应为z < values.length
。正如您在第一个for
中使用的那样。
3。即使块是单行的,也始终使用{ }
。
<强> UPD 强>
4。找到所需内容后,使用break;
停止迭代。
for(){
for(){
}
if(counter == 2) {
twoDuplicate = true;
break;
}
}
或更好
for(int i = 0; i < values.length && counter < 2; i++;){
for(){
}
}
return counter >= 2;
答案 5 :(得分:0)
这就是我只用一个循环
的方法 public static boolean twoDuplicates(int[] values) {
HashSet<Integer> map = new HashSet<Integer>();
int cont = 0;
for (int i = 0; i < values.length; i++) {
if (map.contains(values[i])){
cont++;
if (cont == 2)
return true;
}
else
map.add(values[i]);
}
return false;
}