2010-08-05 2 views
-2

Array имеет 101 значение. Этот массив содержит числа от 1 до 100 и одно число повторяется (два раза). Напишите код psuedo, чтобы найти повторяющийся номер.psuedo код, чтобы найти повторяющийся номер?

+2

Что это? Домашнее задание? Вызов? Спам? –

+0

Согласитесь, это почти похоже на вырезание и вставку из задания! –

ответ

0
  1. Можно хэш значения и обнаружение столкновений
  2. Вы можете отсортировать массив, то петля этого нахождение дубликатов
  3. Вы можете искать массив (длинный и медленно!)

Если вы хотите быть умным, взгляните на хеширование. Если вы хотите играть в нее легко и безопасно, сортировка списка с помощью сортировки слиянием, то, пожалуй, лучше всего зацикливать индексы.

+0

Сортировка массива будет O (N log N), и это если вы выберете подходящий алгоритм сортировки. Линейный поиск с массивом «видимых» флагов будет быстрее (O (N), а операции тривиальны). Эта последняя часть является ключевой, хотя - сравнение каждой записи со всеми остальными действительно «длинное и медленное», поэтому не делайте этого, если нет ответа O (1) на вопрос «видел ли я это число раньше?» , – cHao

+0

Как у вас есть «видимый» флаг? Это проблема! –

+0

Было бы тривиально на языках, которые предоставляют наборы или словари. Перемещайте массив и добавьте число в набор, если он еще не существует. Если это так, у вас есть дубликат. –

0

Я бы добавил все индексы [0] -> [100], чтобы узнать, что 1 + 2 + 3 ... + 100 должно равняться вычитанию из вашего результата, и вы получили повторяющийся номер.

Таким образом, вы бы просто иметь простой

for или while цикл, проходящий через каждый индекс затем вычесть 2 и у вас есть результат.

Что-то вроде ...

q = 0; 
p = 101 * 50; 
for(i<=100; i <array.length; i++){ 
q += q + array[i] 
} 
repeating number = q-p; 
+0

Умный :) (и некоторый обязательный шум для достижения «достаточно» символов) – sarnold

+0

Вам не нужно добавлять все числа от 1 до 100, чтобы узнать общее количество. Это просто 101 * 50 = 5050. – Guffa

+0

Для справки простой способ рассчитать 1 + 2 + 3 + ... + 100 будет '(1 + 100) * 100/2'. Работает для любых двух чисел; просто замените '1' на низкое число и' 100' на высокий. – cHao

0

Попробуйте это (C#):

int[] array = ... ; // initialize appropriately 
var hashSet = new HashSet<int>(); 
var indexOfDuplicate = -1; 
for (var i = 0; i < array.Length; i++) { 
    if (hashSet.Contains(array[i])) { 
     indexOfDuplicate = i; 
     break; 
    } 
    hashSet.Add(array[i]); 
} 
var duplicateNumber = array[indexOfDuplicate]; 

С помощью этого решения вы будете иметь как индекс дубликата числа (второе вхождение) и дубликата числа ,

0

Комплект поставки;

для каждого p в массиве { set.add (p); }

печать (комплект);

Смежные вопросы