开发者

Find Duplicates In Arrays

开发者 https://www.devze.com 2023-02-23 08:18 出处:网络
I am writing a method that would take the values and the array and find duplicates.If there are duplicates, like for instance two values have the same value, I will multiple that value by 2.If two val

I am writing a method that would take the values and the array and find duplicates. If there are duplicates, like for instance two values have the same value, I will multiple that value by 2. If two values have the same value, I will multiple that value by 3. This will continue until if seven values are the same. I will multiple that value by 7.

This is my source code.

public static double calculateWinnings(int[]numbers)

    {
        double total = 0;
        for (int i = 0; i < numbers.length - 1; i++)
        {
            for (int j = i + 1; j < numbers.length; j++)
            {
                if(numbers[i] ==开发者_C百科 numbers[j])
                {
                    total = numbers[i] * .01;
                    System.out.println("Total is " + total);
                    return total;
                }
            }
        }
        return total;

    }


If order doesn't matter, you should sort first, then analyze.

Sorting will put identical values next to each other, where you could more easily notice them in a for loop.

The Java Collections classes may also be of use here.

See for instance http://download.oracle.com/javase/tutorial/collections/intro/index.html

For instance, if you don't want to sort first and use a loop, you could use a HashMap from the collections classes.

HashMap<Integer, Integer> counts = new HashMap<Integer, Integer>();
for(int i=0; i < numbers.length; ++i){
  Integer before = counts.get(numbers[i]);
  if (before == null) before=0;
  counts.put(numbers[i], before+1);
}

now you have a mapper from numbers to counts later you can use something like max(counts.valueSet()) to find the maximum count and then loop back through your hash to see which number caused that.


If you have same values at index 1, 4, 6, you will find them with

i j conclusion
--------------
1 4  2 values
1 6  3 values
4 6  4 values // oops! already counted

and so on. Well you would - but there is no so on, since you return on the first hit:

    if(numbers[i] == numbers[j])
    {
        total = numbers[i] * .01;
        System.out.println("Total is " + total);
        return total; // oops!
    }

Do you mean break?


You should provide some example inputs and outputs. It's not clear exactly what output you expect. Are you just looking to find the most duplicates and then multiply that number by the frequency it appears? For example:

1 2 5 5 5 7 8 8 = three 5's = 15    

Or perhaps the two 8's wins because their total is 16? Or are you going to sum all of the duplicates? In any case I'd start with this, where MAX_NUM is the highest number you expect in the array:

int[] counts = new int[MAX_NUM];
for (int i = 0; i < numbers.length; i++) {
    counts[numbers[i]]++;
}

Now you have the counts of each number. If you're looking for the number with the highest count:

int num = 0;
int best = 0;
for (int i = 0; i < counts.length; i++) {
    if (counts[i] > best) {
        num = i;
        best = counts[i];
    }
}

Now num * best would be 15 for my example. Now num will contain the number that occurs the most and best will be the count for it. If there are two numbers with the same count then the higher number will win. Perhaps though in my example above you want 16 instead of 15 because the two 8's have a greater sum:

int max = 0;
for (int i = 0; i < counts.length; i++) {
    max = Math.max(i * counts[i], max);
}

Now max would have 16.

0

精彩评论

暂无评论...
验证码 换一张
取 消