Все равны как на подбор python задача
Пять задачек из тех, которые хорошо бы уметь решать
Зачем я всё это написал? Дело в том, что я давно уже работаю программистом. Прошёл множество собеседований и сам провёл не мало. Видел самых разных разработчиков, наблюдал за ними… И сделал для себя некоторые выводы.
Так как многие спрашивают моего мнения, я решил написать его. Не чтобы кому-то навязать, просто, чтобы не рассказывать много раз.
Конечно, задачи сильно зависят от того, на какую ставку вы идёте и чем предполагаете заниматься. Но поверьте, если вашему работодателю достаточно того, что вы умеете плести цепочки вызовов на jQuery, знаете HTML, или SQL, то задумайтесь, — возможно, вас ждёт скучноватая работёнка.
Если же вашему работодателю не так уж важно на каком языке вам удобней выражать свои мысли. Если он больше обращает внимание на вашу эрудицию, — старайтесь получить эту работу. Вас, скорее всего, ждут разнообразные и интересные задачи.
Ладно, оставим разговоры. Сперва приведу задачи, а потом решения. Вы можете не проматывать до них и решить задачки самостоятельно. Если вы уложитесь в час, то ждём вас не собеседование ,-) Приступим.
Задачи
Первая задача
У вас есть массив чисел. Напишите три функции, которые вычисляют сумму этих чисел: с for-циклом, с while-циклом, с рекурсией.
Вторая задача
Напишите функцию, которая создаёт комбинацию двух списков таким образом:
Третья задача
Вычислите первые 100 чисел Фибоначчи. (Напишите код.)
Четвёртая задача
У вас есть массив чисел, составьте из них максимальное число. Например:
Пятая задача
У вас есть девять цифр: 1, 2, …, 9. Именно в таком порядке. Вы можете вставлять между ними знаки «+», «-» или ничего. У вас будут получаться выражения вида 123+45-6+7+89 . Найдите все из них, которые равны 100.
Постарайтесь решить эти задачи за час.
А теперь ответы
Решения
Я буду приводить решения на Python3. Кроме того, это те решения, которые можно написать за час. В чём-то они не идеальны, это повод поговорить и, возможно, взять дополнительное время.
Задача первая
Конечно, если вы рассказывайте про Python, то имеет смысл сказать и про функцию sum или reduce . Если речь идёт о других языках, будет не лишним упоминать возможности их библиотек. Но здесь интересно ваше решение.
В первой функции говорить особо не о чем. Спасибо Python.
Во втором случае уже можно порассуждать надо ли разрушать массив (вынимая из него элементы). Или пойти по тому пути, который выбрал я. Тут тоже можно обратить внимание на то, как эта функция невыгодно выглядит по сравнению с рекурсивной. Есть множество мест, где можно допустить ошибки.
Рекурсивная функция прекрасна.
Задача вторая
Тут нет ничего необычного, но можно порассуждать о библиотеках. Если речь про Python можно предложить решение типа sum(zip(a, b), ()) .
Задача третья
Я реализовал итератор. Этим можно было бы показать, что вы про них знаете и здесь их использование уместно.
Тут уже можно поговорить и о языке. Если ваш язык не Python, то, возможно, вам следует задуматься о типе и битности чисел, так как сотое число содержит 68 бит.
Кроме того, есть способ расчёта чисел Фибоначчи путём возведения в степень матриц. Он позволяет не рассчитывать все числа последовательности. Возможно, от вас хотят именно его.
Задача четвёртая
Код (не правильный):
Эта задача больше всего зависит от языка. Я её решил, используя возможности Python.
upd:
Этот код провисел на сайте года три, пока, некто Роман Парпалак не указал мне на ошибку.
Я сохраню интригу и не буду говорить в чём ошибка. Но код, дающий правильный результат я всё же приведу:
Да, тут Python2. В Python3 придётся сделать что-то вроде этого:
Зачем я сохранил неправильный код? По нескольким причинам.
Во-первых, удалить его было бы не честно с моей стороны. Я же декларировал, что решу задачи за час. За указанное время я дал именно это решение.
Во-вторых, чтобы читатель мог поискать ошибку, подумать, нет ли ошибок в его решении…
В-третьих, чтобы подчеркнуть, что все могут ошибаться. Решение задач на время всегда будет сопровождаться ошибками. Недавно я проходил очень интересное интервью. Будет время, — напишу про него отдельно. Но меня в нём поразило то, что олимпиадных задач не было, и спешки тоже не было. И мне кажется, что эти люди действительно хорошо понимают, кого ищут, и выстраивают интервью адекватно своему пониманию. Но это отдельная интересное история.
А тут я лишь скажу: спасибо, Роман. Интересно было бы узнать ваш вариант решения.
Задача пятая
Тут есть простор для творчества. Мой код таков:
Мне кажется, в таком виде его проще всего и писать и читать и тестировать. Тут у меня три функции: all_combinations — итератор, который выдает все числа для операций (в терминах задачи: вставляет пустые места); all_signs — выдаёт все возможные сочетания знаков + и — заданной длинны (для единообразия, это тоже итератор с рекурсией); perform_operations — выполняет операции.
Тут, конечно, просится решение, избавленное от if-ов и кодирования операций с помощью символов. Но это решение будет более громоздким, о нём можно рассказать, но и писать, и читать его дольше. Лично я вышел бы за рамки отведённого часа.
Наверняка вам по душе будет какое-то иное решение. Мой пример — лишь одна из возможных реализаций.
Вместо заключения
Где можно взять таких задачек? Можно начать с Project Euler. Там, правда, немного более математизированные задачки, но это и не плохо. И сложность задач расчёт очень быстро. Я решил восемьдесят.
Если вы знаете ресурсы с хорошими задачками — пожалуйста напишите мне.
upd: В моём решении пятой задачи Мерзляков Александр из Уфы нашел неточность. Спасибо! Я поправил. Получается, что я на эти решения потратил больше часа.
Все равны, как на подбор
Заполнить матрицу следующим образом: элементы побочной диагонали равны 0, все остальные элементы равны 1
Заполнить целочисленную матрицу А размером 10Х10, так чтобы каждый элемент на побочной диагонали.
всё ребра параллелепипеда равны ‘a’. Плоские углы одного трёхгранного угла равны 45 градусов, 60 и 90 градусов
всё ребра параллелепипеда равны ‘a’. Плоские углы одного трёхгранного угла равны 45 градусов, 60 и.
Как подсчитывается количество строк и столбцов, все элементы которых оказались равны 0
Как подсчитывается количество строк и столбцов, все элементы которых оказались равны 0
Количество различных элементов последовательности, все значения элементов которой либо равны a1, либо равны a2
Найти количество различных элементов последовательности, все значения элементов которой либо равны.
Задача на сравнение 3х чисел
Чтобы попрактиковаться в питоне, друг предложил сделать «простую задачку». Простой она оказалась только на его словах… Он говорит, что в 5-6 строк делается. Можно использовать только if, сравнения и арифметические операторы, все остальное нельзя. Нельзя использовать готовые функции.
Задача такая. Вводим 3 числа, далее программа выводит их на экран в порядке возрастания. Плюс учитываем возможность того, что какие-то из них (или даже все) равны.
Сначала я потратил целый день, и получилось больше 100 строк. Все это время меня не покидало неприятное ощущение, что такого бреда быть не может. Я навелосипедил все возможные варианты и проверки, и получилась неприлично громадная программа. Но вроде кое-как работало… На следующий день я переделал, но получилось все-равно строк на 50. Потом я представил, а что если мне придется сравнивать 4 числа? А если 5? Это же тогда моя программа вообще разростется до миллиона строк. Но ведь друг сказал «всего 5 строк».
Гугл подсказывает кучу готовых решений, но открывать их не хочется. Может есть какой-то простой алгоритм для решений таких задач?
Рекурсивный поиск подходящих слагаемых: разбор задачи
Рекурсия. Какие эмоции вызывает у вас это слово? Страх? Восторг? Тут возможны варианты. Но, честно говоря, рекурсия это просто еще один способ решения итеративных задач.
В наших циклах for мы выполняем какое-то действие Х десять раз. А в рекурсии Х — это повторный вызов того же метода. И вместо того чтобы вызывать его десять раз, мы вызываем его до тех пор, пока не будет соблюдено какое-то условие. Что это может быть за условие? Его мы определяем сами.
Давайте разберем это на примере решения задачи с собеседования.
Для начала давайте подумаем, как нам решить эту задачу итеративно. Придумаем брутфорс-решение, так сказать.
Мы можем просто создать вложенный цикл for , в котором будем складывать каждое число списка с каждым из остальных чисел в списке, проверяя, равна ли их сумма k .
Начнем с создания метода add_to_k(), принимающего два параметра: наш список numbers и сумму k .
В первом цикле for мы будем перебирать индексы в диапазоне от 0 до длины списка, уменьшенной на единицу. Мы вычитаем единицу, чтобы впоследствии не захватывать последний элемент списка: за ним уже ничего нет, так что не будет, с чем его сравнивать.
Внутри цикла мы возьмем первый выбранный элемент и поместим его в переменную current . После этого нам нужно пересмотреть все числа в списке, идущие за этим элементом. Тут нам поможет вложенный цикл for .
Наконец, если сумма двух чисел равна k , мы вернем True. Если мы переберем весь список и не найдем подходящих слагаемых, дающих в сумме k , мы вернем False (вне цикла). Все вместе выглядит следующим образом:
Давайте попробуем запустить это решение.
Отлично. Задача решена, но можно ли сделать то же самое рекурсивно?
Рекурсивный поиск
Начинаем писать метод точно так же. Он будет принимать параметры numbers и k .
Далее нам нужно определить наш базовый случай (или случаи). Когда имеешь дело с рекурсией, нужно спросить себя: «Каким будет простейший случай?» Подключите своего внутреннего ленивого программиста. Если бы вам нужно было решить эту задачу, имея возможность выбрать список, какой бы вы выбрали?
Вероятно, это был бы список со всего одним элементом: в этом случае ответ точно был бы False. Это и будет наш первый базовый случай. Поставим длину списка меньше 2: таким образом пустые списки тоже попадут в эту категорию.
Что дальше? Нам нужно прописать еще один базовый случай. Если список должен содержать как минимум два элемента, самым простым вариантом будет список, содержащий ровно два элемента! В таком случае мы сможем просто сложить эти два числа и проверить, равна ли их сумма k . Поскольку длина списка нам не известна, давайте будем просто складывать первый и последний элемент списка.
Теперь нам остается только прописать наш рекурсивный случай, т. е. тот, где мы заново вызываем наш метод.
Давайте подумаем. Наш список — [10, 15, 3, 7] и мы ищем числа, в сумме дающие 10.
Очевидно, что длина списка больше 2, так что мы пропускаем первое условие if . В elif мы видим, что первый и последний элементы в сумме дают 17, что не равно 10. И что теперь?
Нам нужно вызвать метод add_to_k_recursive() для меньшего списка, в котором первый и последний элементы будут другими. Мы можем проверить два варианта меньшего списка:
- Все те же числа, за исключением первого значения.
- Все те же числа, за исключением последнего значения.
На Python это выглядит следующим образом (см. срезы):
Таким образом, мы будем вызывать наш метод дважды, по разу для каждого из двух меньших списков. Что мы будем возвращать? Припомните, что в Python при помощи or можно вернуть первое истинное значение. Мы вернем один вызов метода или другой.
Проверяем
Запустим тот же код, что и раньше. Мы должны получить тот же результат — True.
Давайте посмотрим, что происходит под капотом.
Мы начинаем со списка [10, 15, 3, 7] . Как уже говорилось, первый и последний элементы в сумме не дают 10. Поэтому мы вызываем функцию снова для меньших списков, [10, 15, 3] и [15, 3, 7] .
Каждый из этих списков снова разбивается надвое. Второй список разделится на [15, 3] и [3, 7] . Вызов нашего метода для последнего из этих списков вернет True. Таким образом True будет возвращаться по цепочке вверх до начального экземпляра метода.
Надеемся, это помогло вам приблизиться к пониманию рекурсии. Ее применение в данном случае ничуть не улучшило временную сложность решения. Нам все равно приходится просматривать каждое число дважды (примерно), а это O(N 2 ). Но вы можете найти это решение более элегантным. К тому же, уметь применять рекурсию — совсем не плохо, особенно, когда в задаче на собеседовании нужно проверить «все возможные комбинации».
Задача на сравнение 3х чисел
Чтобы попрактиковаться в питоне, друг предложил сделать «простую задачку». Простой она оказалась только на его словах… Он говорит, что в 5-6 строк делается. Можно использовать только if, сравнения и арифметические операторы, все остальное нельзя. Нельзя использовать готовые функции.
Задача такая. Вводим 3 числа, далее программа выводит их на экран в порядке возрастания. Плюс учитываем возможность того, что какие-то из них (или даже все) равны.
Сначала я потратил целый день, и получилось больше 100 строк. Все это время меня не покидало неприятное ощущение, что такого бреда быть не может. Я навелосипедил все возможные варианты и проверки, и получилась неприлично громадная программа. Но вроде кое-как работало… На следующий день я переделал, но получилось все-равно строк на 50. Потом я представил, а что если мне придется сравнивать 4 числа? А если 5? Это же тогда моя программа вообще разростется до миллиона строк. Но ведь друг сказал «всего 5 строк».
Гугл подсказывает кучу готовых решений, но открывать их не хочется. Может есть какой-то простой алгоритм для решений таких задач?
Все равны как на подбор python задача
Комбинаторика в Python
Заполнить матрицу следующим образом: элементы побочной диагонали равны 0, все остальные элементы равны 1
Заполнить целочисленную матрицу А размером 10Х10, так чтобы каждый элемент на побочной диагонали.
Как подсчитывается количество строк и столбцов, все элементы которых оказались равны 0
Как подсчитывается количество строк и столбцов, все элементы которых оказались равны 0
Все равны как на подбор python задача
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
- Copy lines
- Copy permalink
Footer
© 2022 GitHub, Inc.
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Задачи Python
Основы
Задачник 2021
Сборник задач с решениями по программированию на языке Python.
Задачник 2021
Также может быть интересно
Donation сайту smartiqa.ru
Все материалы проекта Smartiqa были и остаются бесплатными. Пожертвованные деньги пойдут на оплату хостинга, продление доменного имени, администрирование и развитие сайта.
Доступны 2 способа осуществления пожертвования:
1. Оплата через сайт сервиса «ЮMoney», что гарантирует корректность и безопасность процедуры оплаты.
2. Перевод напрямую на карту Тинькофф.
Обратите внимание, что в обоих случаях перевод осуществляется физическому лицу.
Donation сайту smartiqa.ru
Все материалы проекта Smartiqa были и остаются бесплатными. Пожертвованные деньги пойдут на оплату хостинга, продление доменного имени, администрирование и развитие сайта.
Доступны 2 способа осуществления пожертвования:
1. Оплата через сайт сервиса «ЮMoney», что гарантирует корректность и безопасность процедуры оплаты.
2. Перевод напрямую на карту Тинькофф.
Обратите внимание, что в обоих случаях перевод осуществляется физическому лицу.
Получатель: Татьяна Васильевна К.
Номер карты Тинькофф: 5536 9137 5246 3444
Номер телефона: +79529984747
Так же можно воспользоваться QR-кодом выше.