Поиск повторяющегося числа в массиве
От: Xobotik Россия  
Дата: 01.04.10 15:45
Оценка: :))) :))
Условие задачи:
Дан массив размера N из целых чисел, принимающих значения от 1 до M, при этом одно
число в этом массиве повторяется два раза. Найти это число за время O(N).

Реализация:
private static string separator = ";";
        static void Main(string[] args)
        {
            int[] result = GetIntArray(InputArray());
            PrintArray(result);
            Console.WriteLine(ff(result));
            Console.ReadLine();
        }
        private static string InputArray()
        {
            Console.WriteLine("Введите массив, содержащий только целые числа.");
            Console.WriteLine("После каждого числа ставьте разделитель '{0}'", separator);
            Console.WriteLine("Введите массив: ");
            return Console.In.ReadLine();
        }
        private static int[] GetIntArray(string insert)
        {
            string pattern = String.Format("{0}(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))", separator);
            string[] bufResult = Regex.Split(insert, pattern);
            int[] result = new int[bufResult.Length];
            for (int i = 0; i < bufResult.Length; i++)
            {
                result[i] = Int32.Parse(bufResult[i]);
            }
            return result;
        }
        private static void PrintArray(int[] array)
        {
            foreach(int i in array)
            {
                Console.WriteLine(i);
            }
        }
        private static int ff(int[] array)
        {
            int m = 1;
            int buf = 0;
            // общее количество сравнений (n-1)^2, где n - длина массива
            for (int i = 0; i < (array.Length - 1) * (array.Length - 1); i++)
            {
                // количество перестановок (n-1) = количеству сравнений array[0] и array[k], где k - числа от 1 до n (n - длина массива)
                for (int j = 1; j < array.Length; j++)
                {
                    if (array[0] == array[j])
                    {
                        buf = array[0];
                        goto result;
                    }
                }
                Swap(array, m);
                m++;
            }
        result:
        return buf;
        }
        private static void Swap(int[] array, int index)
        {
            int temp = array[index];
            array[index] = array[0];
            array[0] = temp;
        }


Есть ли какие-либо другие пути решения задачи? Без goto не вижу решения задачи, если использовать break, там где buf = array[0] , останавливается только цикл:

for (int j = 1; j < array.Length - 1; j++)


при этом работа цикла

for (int i = 0; i < (array.Length - 1) * (array.Length - 1); i++)


не прерывается

Заранее спасибо!

01.04.10 22:00: Перенесено из '.NET'
С уважением!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.