2017-02-24 32 views
0

我正在尝试编写一个接受整数数组并返回该数组中唯一值数的方法。例如,对于数组{5,6,5,7,5,7},该方法返回3,因为有3个重复项(5,5,7)。我不确定我出错的地方,我尝试创建一个变量list,这样当我打电话给numUnique(list)时,它会给我我的答案,但这似乎不起作用。有什么建议么?查找用户输入数组中唯一值的数

代码:

import java.util.Scanner; 

public class Unique_Values { 
public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    int n = sc.nextInt(); 
    int[] list = new int[n]; 
    System.out.printf("%d%n ", list); 
} 

public static int numUnique(int[] list) { 
    if (list.length == 0) { 
     return 0; 
    } else { 
     int count = 1; 
     for (int i = 1; i < list.length; i++) { 
      if (list[i] != list[i - 1]) { 
       count++; 
      } 
     } 
     return count; 
    } 
    } 
} 
+3

“似乎并没有工作“并不是一个明确的问题描述。你的意见是什么?你期望输出什么? – shmosel

+1

您的方法只检查相邻的重复项。 – shmosel

+0

你需要一个内部循环。你只是在数字之前直接检查元素,例如:'4545'你比较'5'到'4'而不是'5'到'5'。您需要将数组中的每个数字与所有其他数字进行比较。你可以使用内部循环来做到这一点...... – brso05

回答

0

这不会是代码来解决你的问题,因为我认为思考这个问题是很重要的。

要做到这一点的一个蛮力方法是有一个列表,让它调用returnList,并在读入列表时向列表中添加元素。每当您想要将列表中的元素添加到列表中时应该检查列表以确保元素之前没有添加过。如果之前添加过,则不会将该元素添加到列表中,然后移动到下一个输入元素中。在读完整个数组后,简单地返回returnList的长度,这是微不足道的。

请注意,这绝不是一种有效的方法来做到这一点(要求您每次检查列表),并且只是解决此问题的一种方法。我恳请您尝试思考解决问题的更好方法!

祝你好运!

+2

为什么你会用列表而不是集合? – shmosel

+0

再次,这不是唯一的实现,并且意在给出一个非理想的算法,迫使OP考虑如何提供更好的时间复杂度/效率。我同意你的观点,那就是要走的路,但是我希望OP能够自己想出来! :) – Jay

0

您的代码将list[i]list[i - 1]进行比较,这意味着您只是检查相邻的重复项。要滤除所有重复项,您需要使用内部循环针对每个连续元素检查list[i]。例如:

int count = 1; 
for (int i = 0; i < list.length - 1; i++) { 
    for (int j = i + 1; j < list.length && list[i] != list[j]; j++) { 
     if (j == list.length - 1) { 
      count++; 
     } 
    } 
} 

注意,有许多方式来配制的上方,并且有完全清洁和更有效的方法来计算不同的元件比具有内环,如在注释中提到。

0

您的代码if (list[i] != list[i - 1]) { count++; }只是检查相邻的重复项。所以在数组[5,4,5]中,这两个五不会被认为是重复的。

解决此问题的一种方法是使用强力方法,即嵌套for循环,inner循环通过完整的剩余数组。

更好的方法在我看来是扫描数组,并继续插入值设置。一旦扫描完成,该组的长度就是您的答案(唯一值的数量)。

在Java中,考虑输入是整数列表,下面的代码可用于:

public static int findNumberOfUniqueElements(List<Integer> list) { 
    if (list == null) { 
     return 0; 
    } 
    return (new HashSet<Integer>(list)).size(); 
} 

更通用的代码,以适应在任何语言以下:

public static int findNumberOfUniqueElements(List<Integer> list) { 
    if (list == null) { 
     return 0; 
    } 
    Set<Integer> set = new HashSet<Integer>(); 
    for (int i=0; i<list.size(); i++) { 
     set.add(list.get(i)); // get list[i] 
    } 
    return set.size(); 
} 
0

如果您只想使用数组,

为了找到重复条目的计数,您需要先对数组进行排序,然后比较相邻元素,如果两者都相同,则递增计数。

下面是代码:

public static int numUnique(int arr[]) 
{ 
    int dup = 0; 

    Arrays.sort(arr); 

    for(int i = 1 ; i < arr.length ; i++) 
    { 
     if(arr[i-1] == arr[i]) 
      dup++; 
    } 
    return dup; 
} 

有与使用ArrayList的

这里一个比较简单的方法是代码:

public static int numUnique(int arr[]) 
{ 
    int dup = 0; 

    ArrayList<Integer> al = new ArrayList<Integer>(); 

    for(int i = 0 ; i < arr.length ; i++) 
    { 
     if(!al.contains(arr[i])) 
     { 
      al.add(arr[i]); 
     } 
     else 
      dup++; 
    } 
    return dup; 
}