计算独特元素的数量

时间:2015-02-18 02:56:33

标签: java arrays duplicates

嗨所以我应该在数组排序后计算唯一元素的数量,不包括重复项,但是输出错误。

In in = new In(args[0]);
int[] whitelist = in.readAllInts();
Arrays.sort(whitelist);

int count = 0;
   for (int i = 0; i < whitelist.length; i++) {
       if (whitelist[i] == whitelist[count]) {
           count++;
       }
   }
while (!StdIn.isEmpty()) {
    int key = StdIn.readInt();
    rank(key, whitelist);
}
   System.out.println(count);

} }

预期输出:java InstrumentedBinarySearch tinyW.txt&lt; tinyT.txt

65

得到:16

我是否计算过重复的数量?

3 个答案:

答案 0 :(得分:0)

  int flag = 0;
  int count = 0;
       for (int i = 0; i < whitelist.length; i++) //Element to be checked for
  {
           for (int j=0; j< whitelist.length ; j++) //Loop that goes through the whole array 
       {
               if (whitelist[i] == whitelist[j]) //checks if there are duplicates
               {
                   flag++; // count
               }
       }
    if( flag==1) //There should be only 1 instance of the element in the array and that is the element itself
    { 
       System.out.println(whitelist[i]); //displays unique element
       count++; // Keeps count 
    }
 }

答案 1 :(得分:0)

此算法计算阵列中有多少不同的唯一编号。出现不止一次的数字只会计为1.我假设这是你的意思,而不是“只出现一次的数字”。

如另一个答案所提出的,有一种更简单的方法可以做到这一点,但它需要一个嵌套的for循环,因此以二次复杂度执行。我的算法尝试以与数组大小成比例的线性时间来解决问题。

int uniquesFound = 0;

// Assume that array is sorted, so duplicates would be next to another.
// If we find duplicates, such as 12223, we will only count its last instance (i.e. the last '2')
for (int i = 0; i < whitelist.length; i++) {

    // If we are at the last element, we know we can count it
    if (i != whitelist.length - 1) {
        if (whitelist[i] != whitelist[i+1]) {
            uniquesFound++;
        }
        else {
            // Nothing! If they are the same, move to the next step element
        }
    } else {
        uniquesFound++;
    }
}

例如,给定数组:

{1,2,3}这将产生3,因为有3个唯一数字

{1,2,3,3,3,4,4,4,5}这将产生5,因为仍有5个唯一数字

答案 2 :(得分:0)

首先让我们来看看你的循环:

for (int i = 0; i < whitelist.length; i++) {
    if (whitelist[i] == whitelist[count]) {
        count++;
    }
}

您应该比较列表中的连续元素,例如白名单[0] ==白名单[1] ?,白名单[1] ==白名单[2] ?,白名单[3] ==白名单[4]?,在这种情况下,做whitelist[i] == whitelist[count]没有任何意义。

现在您有两个选择:

一个。当您找到两个相等的连续元素并从数组的总大小中减去结果时递增计数器:

for (int i = 0; i < whitelist.length - 1; i++) {
    if (whitelist[i] == whitelist[i + 1]) {
        count++;
    }
}
int result = whitelist.length - count;

湾更改条件以计算不相等的连续元素之间的转换。由于您要计算转换次数,因此最后需要将1添加到count以获取数组中唯一元素的数量:

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

请注意,在这两种情况下,我们只会循环到whitelist.length - 1,因此whitelist[i + 1]不会超出范围。