Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм поиска 
V
    Опции темы
Wanderer2019
Дата 4.9.2013, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



Всем привет,


Недавно на собеседовании задали такой вопрос - 

Есть массив целых чисел.. из него убрали 1, как узнать какое? Если убрали 2 числа?

В случае с одним понятно.. сумма элементов одного, минус сумма элементов другого.. 

А как быть если убрали больше 1 числа.. перебором?


PM ICQ MSN   Вверх
gambit
Дата 5.9.2013, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



http://habrahabr.ru/post/154765/

там в комментах есть эта задача.
ps. а для суммы вам перебор не нужен?
PM MAIL ICQ Skype   Вверх
Wanderer2019
Дата 5.9.2013, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



Ну, тут скорей вопрос не в переборе я так понимаю, а в операциях участвующих в процессе.

Т.е. либо выбрал - сравнил, либо выбрал и сложил.
Думаю сравнение будет медленней.
PM ICQ MSN   Вверх
Wanderer2019
Дата 5.9.2013, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



gambit, 
Благодарю за линк.. Никак не могу допетрить в случае с бинарным поиском.. когда обрывать процесс???

PM ICQ MSN   Вверх
Агрох
Дата 5.9.2013, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Массивы:
изначальный
1  4  3  7  10  15  3  2
после того как из него убрали 2 числа
1  4  7  10  3  2

Начинаем параллельно суммировать все числе в обоих массивах. Когда доходим до момента, когда суммы не совпадают, для первого массива прибавляем следующее число. Разница результатов - первое выкинутое число. Суммируем дальше и находим второе выкинутое число. 
По идее не имеет значения сколько чисел было выкинуто.

Но тут есть недостаток, если выкинули два соседних числа то не сработает.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Wanderer2019
Дата 5.9.2013, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



Агрох, 
Ты не знаешь каков изначальный массив.. 

есть только массив 1..n

в нем нехватает 2 чисел. нужно их найти.

Edit:

Хотя нет вру.. знаешь. Т.е. известно что это последовательность.

Но ИМХО суммирование и сравнение это еще медленнее чем просто сравнение отсортированного.

Это сообщение отредактировал(а) Wanderer2019 - 5.9.2013, 16:12
PM ICQ MSN   Вверх
Агрох
Дата 5.9.2013, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Wanderer2019, это вариант поиска недостающего числа, который пришёл мне в голову сразу как прочитал вопрос.
И ты в условии не написал, что массив это последовательность чисел, т.е. они уже отсортированы и нет повторяющихся. Эта задача намного проще. Мы же не ищем лёгких путей. smile 

А так да, отсортировать и сравнить отсортированные массивы по крайней мере сработает в любом случае. Насчёт быстрее, не знаю. Их же ещё отсортировать надо.

И ещё, если это вопрос на собеседовании, то в первую очередь важно не то, правильно ли ты ответил, а то что ты вообще ответил. Перед тобой ставят задачу и смотрят как ты её решаешь. Кому то интернет нужен для решения, кто то сразу скажет что не знает, кто то поковыряется и всё равно не решит, кто то сходу предложит неоптимальный и глючный вариант (как я).

Мне вот на собеседовании дали задачку написать функцию вычисления факториала. smile 3 строки кода за 20 секунд. И главное, на что думаю наниматели обратили внимание, я спросил: "А что такое факториал?" - вылетело из головы, т.к. вуз 6 лет назад закончил и факториалами по жизни и на работе не пользовался.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Wanderer2019
Дата 5.9.2013, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



Цитата(Агрох @  5.9.2013,  14:26 Найти цитируемый пост)
А так да, отсортировать и сравнить отсортированные массивы по крайней мере сработает в любом случае. Насчёт быстрее, не знаю. Их же ещё отсортировать надо.


Нутк вот это как раз то на чем хотят словить.. По сути бинарный поиск бы подошел. Не могу сообразить с алгоритмом...

вот набросал:
Код

        static List<int> FindMissing(List<int> arr, int correction, List<int> res)
        {
            if (arr.Count == 0)
                return res;

            int c = arr.Count / 2;
            var cValue = arr[c];
            var iValue = cValue - (c + correction);

            if (iValue < 2)
            {
                if (arr.Count == 1)
                {
                    res.Add(cValue + 1);
                }

                return FindMissing(arr.GetRange(c+1, arr.Count-1 - c), c, res);
                
            }
            else if (iValue > 2)
            {
                if (arr.Count == 1)
                {
                    res.Add(cValue - 1);
                }

                return FindMissing(arr.GetRange(0, c), 0, res);
            }
            else//equal 2 - middle
            {
                ...
            }

            return res;
        }


Не могу сообразить откуда воторое число брать (или после поиска первого добавлять недостающее и искать снова?)...
PM ICQ MSN   Вверх
Wanderer2019
Дата 5.9.2013, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



Еще из вариантов почерпнутых в инете... для двух чисел.. посчитать не только сумму, но и скажем факториал - 1*2*3*4*5...

Цитата

Для двух чисел пробегись по массиву, накапливая сумму и произведение. В конце останется решить уравнение X1+X2=a; X1X2=b; Где а=сумма полного ряда - сумма де-факто и b=произведение полного ряда / произведение де-факто. 


В конце получаем два уровнения - x1+x2=a и x1*x2=b, далее решаем квадратное..

Пробовал несколько раз, но не выходит аленький цветочек.. дискриминант получается меньше 0.. т.е. решения нет..

Может я что то позабыл из математики.. 
PM ICQ MSN   Вверх
Агрох
Дата 5.9.2013, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Wanderer2019, бинарный же это поиск чего то конкретного в отсортированном массиве. А тебе надо сравнить два массива и найти то что есть в первом, но нет во втором.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Wanderer2019
Дата 5.9.2013, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



попробовал с суммой квадратов.. то же самое..

т.е. x1+x2=a и x1^2+x2^2=b... 

решение не дает правильного результата
PM ICQ MSN   Вверх
Wanderer2019
Дата 5.9.2013, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



Все.. признаю себя идиотом.. все просто..

для двух

x1+x2=сумма членов полного - сумма членов урезанного
x1*x2=произведение членов полного/произведение членов урезанного

решение квадратного ур дает правильноый результат
PM ICQ MSN   Вверх
diadiavova
Дата 5.9.2013, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Wanderer2019, у меня вопрос: тебе когда задавали задачу поставили какие-нибудь ограничения на способ ее выполнения? Есть же стандартный функционал
Код

       static void Main(string[] args)
        {
            int[] a1 = new int[] { 1, 3, 5, 7, 9, 11, 13, 15 };
            int[] a2 = new int[] { 11,3,9,5,1 };

            Array.ForEach(a1.Except(a2).ToArray(),Console.WriteLine);
            Console.ReadKey();
        }
Вывод
Код

7
13
15
То есть выводит все удаленные объекты, независимо от типа и количества. smile


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Wanderer2019
Дата 6.9.2013, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



diadiavova, 
Ограничения на решение не было разумеется, но подобного типа задачи предлагаются для того, чтобы оценить способности кандидата логически мыслить.
Т.е. применение стандартных методов .net в данном случае, наверное, не самый лучший вариант, хотя, безусовно, самый близкий к реальности...
PM ICQ MSN   Вверх
diadiavova
Дата 8.9.2013, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(Wanderer2019 @  6.9.2013,  10:45 Найти цитируемый пост)
Ограничения на решение не было разумеется, но подобного типа задачи предлагаются для того, чтобы оценить способности кандидата логически мыслить.

Исходя из постановки задачи, в принципе, такой вывод можно сделать: 
1. Указан конкретный тип данных.
2. Варианты с одним удаленным значением и с двумя представлены по сути как разные задачи.
3. Вопроса о произвольном количестве удаленных элементов не последовало. 

Тем не менее: 
1. Чтобы свести задачу к применению стандартного функционала, логика тоже вроде как нужна.
2. Для применения функционала надо как минимум знать о его существовании.
3. Нахождение более общего решения куда ценнее умения найти оригинальное, но слишком частное решение(если функция Except недоступна, то ее неплохо было бы написать самому).
4. То решение, на котором остановился ты, скорее показывает способность решать головоломки из книжек типа "Занимательные задачи по математике для школьников", нежели способности, каким-либо образом связанные с программированием.
5. У меня есть очень серьезное подозрение, что программист, давший такой ответ, либо знаком с задачей либо загуглил ее, а таких кому в голову пришел бы именно такой ответ - единицы.
6. О непрактичности такого решения ты сам сказал.


Цитата(Wanderer2019 @  6.9.2013,  10:45 Найти цитируемый пост)
Т.е. применение стандартных методов .net в данном случае, наверное, не самый лучший вариант
С одной стороны, как уже писалось выше, есть немалая вероятность того, что найденное тобой решение - как раз именно то, чего от тебя ждут. С другой - с практической точки зрения решение плохое и ты можешь выложить именно его только лишь потому, что пытаешься угадать ход мыслей "экзаменаторов". Я думаю, что о стандартном решении в данном случае упомянуть все-таки стоит, даже если в качестве основного ответа будет представлен другой вариант.



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.