Найти дубликаты в массивах - PullRequest
2 голосов
/ 09 апреля 2011

Я пишу метод, который будет принимать значения и массив и находить дубликаты.Если есть дубликаты, как, например, два значения имеют одинаковое значение, я умножу это значение на 2. Если два значения имеют одинаковое значение, я умножу это значение на 3. Это будет продолжаться до тех пор, пока семь значений не будут одинаковыми.Я умножу это значение на 7.

Это мой исходный код.

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] == numbers[j])
                {
                    total = numbers[i] * .01;
                    System.out.println("Total is " + total);
                    return total;
                }
            }
        }
        return total;

    }

Ответы [ 3 ]

1 голос
/ 09 апреля 2011

Если порядок не имеет значения, сначала нужно отсортировать, а затем проанализировать.

Сортировка поместит одинаковые значения рядом друг с другом, чтобы вы могли легче заметить их в цикле for.

Здесь также могут быть полезны классы коллекций Java.

См. Например http://download.oracle.com/javase/tutorial/collections/intro/index.html

Например, если вы не хотите сначала сортировать и использовать цикл, вы можете использовать HashMap из классов коллекций.

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);
}

теперь у вас есть картограф из чисел в счет позже вы можете использовать что-то вроде max (counts.valueSet ()), чтобы найти максимальное количество и затем вернитесь в хэш, чтобы увидеть, какое число вызвало это.

0 голосов
/ 09 апреля 2011

Вы должны предоставить несколько примеров входов и выходов. Не ясно, какой именно выход вы ожидаете. Вы просто хотите найти наибольшее количество дубликатов, а затем умножить это число на частоту, с которой оно появляется? Например:

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

Или, может быть, две победы 8, потому что их общее количество составляет 16? Или вы собираетесь суммировать все дубликаты? В любом случае я бы начал с этого, где MAX_NUM - это наибольшее ожидаемое число в массиве:

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

Теперь у вас есть количество каждого числа. Если вы ищете номер с наибольшим количеством:

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

Теперь num * best будет 15 для моего примера. Теперь num будет содержать число, которое встречается чаще всего, а best будет счетчиком для него. Если есть два числа с одинаковым количеством, выиграет большее число. Возможно, хотя в моем примере выше вы хотите 16 вместо 15, потому что две 8 имеют большую сумму:

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

Теперь max будет иметь 16.

0 голосов
/ 09 апреля 2011

Если у вас одинаковые значения с индексами 1, 4, 6, вы найдете их с

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

и так далее. Ну, вы бы - но нет so on, так как вы вернетесь при первом попадании:

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

Вы имеете в виду break?

...