Здравствуйте, Xobotik, Вы писали:
X>Здравствуйте, OlegMax, Вы писали:
OM>>Попробуем мысленно прогнать на последовательности {3,3}. Получим "index out of bounds".
X>Ну тогда буферный массив будет выглядеть следующим образом: X>
X>int[] buf = new int[array.Max() + 1];
X>
Что за чушь? Пусть array.Max() == 0xFFFFFFFF
Дальше что?
Здравствуйте, Xobotik, Вы писали:
X>Условие задачи: X>Дан массив размера N из целых чисел, принимающих значения от 1 до M, при этом одно X>число в этом массиве повторяется два раза. Найти это число за время O(N).
X>Реализация: X>
X>private static string separator = ";";
X> static void Main(string[] args)
X> {
X> int[] result = GetIntArray(InputArray());
X> PrintArray(result);
X> Console.WriteLine(ff(result));
X> Console.ReadLine();
X> }
X> private static string InputArray()
X> {
X> Console.WriteLine("Введите массив, содержащий только целые числа.");
X> Console.WriteLine("После каждого числа ставьте разделитель '{0}'", separator);
X> Console.WriteLine("Введите массив: ");
X> return Console.In.ReadLine();
X> }
X> private static int[] GetIntArray(string insert)
X> {
X> string pattern = String.Format("{0}(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))", separator);
X> string[] bufResult = Regex.Split(insert, pattern);
X> int[] result = new int[bufResult.Length];
X> for (int i = 0; i < bufResult.Length; i++)
X> {
X> result[i] = Int32.Parse(bufResult[i]);
X> }
X> return result;
X> }
X> private static void PrintArray(int[] array)
X> {
X> foreach(int i in array)
X> {
X> Console.WriteLine(i);
X> }
X> }
X> private static int ff(int[] array)
X> {
X> int m = 1;
X> int buf = 0;
X> // общее количество сравнений (n-1)^2, где n - длина массива
X> for (int i = 0; i < (array.Length - 1) * (array.Length - 1); i++)
X> {
X> // количество перестановок (n-1) = количеству сравнений array[0] и array[k], где k - числа от 1 до n (n - длина массива)
X> for (int j = 1; j < array.Length; j++)
X> {
X> if (array[0] == array[j])
X> {
X> buf = array[0];
X> goto result;
X> }
X> }
X> Swap(array, m);
X> m++;
X> }
X> result:
X> return buf;
X> }
X> private static void Swap(int[] array, int index)
X> {
X> int temp = array[index];
X> array[index] = array[0];
X> array[0] = temp;
X> }
X>
X>Есть ли какие-либо другие пути решения задачи? Без goto не вижу решения задачи, если использовать break, там где buf = array[0] , останавливается только цикл:
X>
X>for (int j = 1; j < array.Length - 1; j++)
X>
X>при этом работа цикла
X>
X>for (int i = 0; i < (array.Length - 1) * (array.Length - 1); i++)
X>
X>не прерывается
X>Заранее спасибо!
Реализация на с
int Find(int * Array,int N, int M)
{
int *AsPresent = new int[M];
memset(AsPresent,0,sizeof(int)*M);
for(int i=0;i<N;i++)
if(AsPresent[Array[i]])
{
delete[] AsPresent;
return Array[i];
}
else
AsPresent[Array[i]] = 1;
delete[] AsPresent;
return -1;
}
Здравствуйте, vsb, Вы писали:
vsb>Здравствуйте, samius, Вы писали:
S>>Здравствуйте, vsb, Вы писали:
vsb>>>Здравствуйте, samius, Вы писали:
S>>>>Здравствуйте, vsb, Вы писали:
vsb>>>>>Здравствуйте, Xobotik, Вы писали:
vsb>>>>>Если M < N, то вот решение. Не выделяет лишней памяти, не изменяет исходный массив. Печатает одно из чисел, которые повторяются 2 или более раз. S>>>>int[] a = { 1, 3, 2, 1, 4 }; S>>>>выдает 4
vsb>>>N = 5, M = 5, условие не удовлетворено. В общем цифры надо считать с нуля. Если каждое число в вашем примере уменьшить на единицу, то всё работает.
S>>Вы условие задачи читали? Числа от 1-го до M!
vsb>Не придирайтесь Пусть будут от 0 до M-1, это ничего не изменит, если надо для исходной задачи — просто -1 написать в некоторых местах.
Никто и не придирается. Просто твое решение неправильное, вот и все.
Здравствуйте, opener, Вы писали:
O>Здравствуйте, vsb, Вы писали:
vsb>>Здравствуйте, samius, Вы писали:
S>>>Здравствуйте, vsb, Вы писали:
vsb>>>>Здравствуйте, samius, Вы писали:
S>>>>>Здравствуйте, vsb, Вы писали:
vsb>>>>>>Здравствуйте, Xobotik, Вы писали:
vsb>>>>>>Если M < N, то вот решение. Не выделяет лишней памяти, не изменяет исходный массив. Печатает одно из чисел, которые повторяются 2 или более раз. S>>>>>int[] a = { 1, 3, 2, 1, 4 }; S>>>>>выдает 4
vsb>>>>N = 5, M = 5, условие не удовлетворено. В общем цифры надо считать с нуля. Если каждое число в вашем примере уменьшить на единицу, то всё работает.
S>>>Вы условие задачи читали? Числа от 1-го до M!
vsb>>Не придирайтесь Пусть будут от 0 до M-1, это ничего не изменит, если надо для исходной задачи — просто -1 написать в некоторых местах.
O>Никто и не придирается. Просто твое решение неправильное, вот и все.
На каких входных данных моё решение даёт неверный ответ?
Здравствуйте, opener, Вы писали:
O>Здравствуйте, SergeySymbol, Вы писали:
SS>>Реализация на с SS>>
SS>>int Find(int * Array,int N, int M)
SS>>{
SS>> int *AsPresent = new int[M];
SS>> memset(AsPresent,0,sizeof(int)*M);
SS>> for(int i=0;i<N;i++)
SS>> if(AsPresent[Array[i]])
SS>> {
SS>> delete[] AsPresent;
SS>> return Array[i];
SS>> }
SS>> else
SS>> AsPresent[Array[i]] = 1;
SS>> delete[] AsPresent;
SS>> return -1;
SS>>}
SS>>
O>Клево. O>Особенно умиляет количество памяти, которое необходимо выделить, для такого, к примеру, массива:
O>
O>int Array[] = { 1, 1, 0xFFFFFFFF };
O>
Приведенный массив не соответствует условию задачи поскольку ты скорее всего имел ввиду int 32 разрядный целочисленный знаковый тип то значение 0xFFFFFFFF будет интерпретировано как -1, а в условии от 1 до M. Да слабость этого алгоритма в выделении дополнительной памяти, а так если не считать memset(AsPresent,0,sizeof(int)*M) то он удовлетворяет условию O(N).
если использовать в качестве словаря контейнеры на основе бинарных деревьев , то сложность будет O(N*log(N)).
Здравствуйте, SergeySymbol, Вы писали:
SS>Приведенный массив не соответствует условию задачи поскольку ты скорее всего имел ввиду int 32 разрядный целочисленный знаковый тип то значение 0xFFFFFFFF будет интерпретировано как -1, а в условии от 1 до M. Да слабость этого алгоритма в выделении дополнительной памяти, а так если не считать memset(AsPresent,0,sizeof(int)*M) то он удовлетворяет условию O(N). SS>если использовать в качестве словаря контейнеры на основе бинарных деревьев , то сложность будет O(N*log(N)).
Как это "не считать"? Инициализация этой памяти займёт O(M), а значит сложность будет O(M+N).
Здравствуйте, Don Reba, Вы писали:
DR>Здравствуйте, SergeySymbol, Вы писали:
SS>>Приведенный массив не соответствует условию задачи поскольку ты скорее всего имел ввиду int 32 разрядный целочисленный знаковый тип то значение 0xFFFFFFFF будет интерпретировано как -1, а в условии от 1 до M. Да слабость этого алгоритма в выделении дополнительной памяти, а так если не считать memset(AsPresent,0,sizeof(int)*M) то он удовлетворяет условию O(N). SS>>если использовать в качестве словаря контейнеры на основе бинарных деревьев , то сложность будет O(N*log(N)).
DR>Как это "не считать"? Инициализация этой памяти займёт O(M), а значит сложность будет O(M+N).
так я это и указал.
Здравствуйте, vsb, Вы писали:
vsb>Здравствуйте, opener, Вы писали:
O>>Здравствуйте, vsb, Вы писали:
vsb>>>Здравствуйте, samius, Вы писали:
S>>>>Здравствуйте, vsb, Вы писали:
vsb>>>>>Здравствуйте, samius, Вы писали:
S>>>>>>Здравствуйте, vsb, Вы писали:
vsb>>>>>>>Здравствуйте, Xobotik, Вы писали:
vsb>>>>>>>Если M < N, то вот решение. Не выделяет лишней памяти, не изменяет исходный массив. Печатает одно из чисел, которые повторяются 2 или более раз. S>>>>>>int[] a = { 1, 3, 2, 1, 4 }; S>>>>>>выдает 4
vsb>>>>>N = 5, M = 5, условие не удовлетворено. В общем цифры надо считать с нуля. Если каждое число в вашем примере уменьшить на единицу, то всё работает.
S>>>>Вы условие задачи читали? Числа от 1-го до M!
vsb>>>Не придирайтесь Пусть будут от 0 до M-1, это ничего не изменит, если надо для исходной задачи — просто -1 написать в некоторых местах.
O>>Никто и не придирается. Просто твое решение неправильное, вот и все.
vsb>На каких входных данных моё решение даёт неверный ответ?