Как научиться решать задачи по программированию


Как научиться решать алгоритмические задачи?

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

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

Оттачивать навыки написания кода на LeetCode - это не просто запоминать ответы. Вам нужно знать шаблоны решения задач и уметь их применять. Количество решённых задач - это только одна сторона знакомства с шаблонами, но изучение включает в себя не только числа.

Пункт 0: За пределами основ компьютерных наук

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

Легкие алгоритмические задачи на LeetCode

Легкие задачи призваны помочь вам ознакомиться с основными приёмами. Обычно у них есть грубые тривиальные решения. Вам нужно научиться применять эти приёмы, чтобы лёгкие задачи не вызывали у вас никаких проблем.

Пункт 1: Практика основных приёмов

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

Как тренироваться

  1. Отсортируйте задачи по убыванию рейтинга принятия (англ. acceptance rate). Обычно задачи с более высоким рейтингом принятия немного легче.
  2. Старайтесь решать лёгкие задачи без подсказок.
  3. Как ни странно, злоупотреблять кнопкой "run" не очень полезно. Попробуйте написать решение лёгких задач так, чтобы они были приняты с первого раза. Такой подход имитирует ситуацию, когда вы пишете код на доске, что позволит вам научиться рассматривать все варианты сразу в голове.
  4. Иногда следует приглядываться к решениям в топе на предмет применения каких-то интересных приёмов. Часто решения попадают в топ, когда они короткие и недостаточно документированы. Также читайте комментарии и не стесняйтесь просить пояснить какие-то моменты.
  5. Как только вы чувствуете что изучили достаточно шаблонов решений простых задач, вернитесь к пункту 1 и решите, готовы ли вы двигаться дальше.

Средние алгоритмические задачи на LeetCode

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

Пункт 2: Распознавание шаблонов задач

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

Как тренироваться

  1. Внимательно читайте сам текст задачи и ищите в нём подсказки по поводу реализации. Например, количество подзадач может указывать на динамическое программирование, строковое преобразование с помощью dictionary указывает на поиск в ширину, поиск в длину или префиксное дерево, поиск повторяющихся или уникальных элементов указывает на хеширование или манипулирование битами и т. д. Если вам требуется более полный список приёмов, то следует обратить внимание на книгу-руководство для программистов.
  2. Когда есть приблизительное представление о решении - это уже полпути. Попытайтесь реализовать его, даже если оно не совсем оптимальное. Это нормально, ведь обычно люди тратят гораздо больше времени на оптимизацию, чем на само решение.
  3. Когда вы реализовали своё неидеальное решение, посмотрите на топовые решения этой же задачи, чтобы посмотреть, как вы можете улучшить своё.
  4. Затем попытайтесь хорошо понять основную мысль и реализовать более оптимальное решение, не используя подсказки.
  5. Как только вы чувствуете, что можете больше, чем просто применять шаблоны, настало время перейти к сложным задачам.

Сложные алгоритмические задачи на LeetCode

Сложные задачи предназначены для того, чтобы заставить вас напрячься. Обычно 45 минут достаточно для того, чтобы вы могли придумать рабочее решение. Чтобы научиться их решать, нужно научиться видеть какие-то более изящные пути, чем тривиальное решение "в лоб".

Пункт 3: Последняя проверка

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

Как тренироваться

  1. В этом случае решение задачи важнее, чем нахождение оптимального решения. Если вы можете решить задачу "в лоб", жертвуя ограничениями по времени и/или месту, делайте это.
  2. И только после нужно определить, как оптимизировать решение, чтобы оно соответствовало ограничениям.
  3. Если у вас не получается оптимизировать решение, то самое время обратить внимание на топовые варианты реализации. Здесь очень важно понять ход решения. Вы должны научиться подбирать правильный алгоритм и использовать нужные структуры данных, а также уметь учитывать все случаи.
  4. Как только вы научитесь находить решения одних сложных задач, переходите к другим видам задач и старайтесь делать ваши решения более оптимальными.

Спасибо, что прочитали. Надеюсь вы нашли для себя что-то полезное.

Как решать задачи программирования

Накануне праздников я сказал, что вам лучше научиться решать задачи программирования.

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

Типичные ошибки

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

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

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

Вы должны сопротивляться этому побуждению.

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

Еще одна большая ошибка - попытка перерешить решение на первой итерации. Будьте проще, не пытайтесь фантазировать.

Простой набор шагов

Я собираюсь дать вам простой набор шагов, которые вы можете использовать для решения любой проблемы программирования типа алгоритма.

  1. Дважды полностью прочтите задачу.
  2. Решите проблему вручную, используя 3 набора образцов данных.
  3. Оптимизация шагов вручную.
  4. Запишите действия вручную в виде комментариев или псевдокода.
  5. Замените комментарии или псевдокод реальным кодом.
  6. Оптимизируйте реальный код.

До 70% нашего времени следует тратить на шаги 1–3.

Рассмотрим каждый шаг.

Полностью прочтите задачу дважды

Это самый важный шаг. Вы даже можете прочитать задачу 3 или 4 раза.

Вы хотите убедиться, что полностью понимаете проблему. Хорошая проверка - можете ли вы объяснить проблему кому-то другому.

Я не могу переоценить важность этого шага!

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

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

Решить проблему вручную

Я вам открою, пожалуй, самый большой секрет программирования.

«Ничего нельзя автоматизировать, чего нельзя сделать вручную!»

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

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

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

По возможности я часто использую метод математической индукции. Используя этот подход, я мог бы попытаться решить сначала 1, затем 2, а затем n.

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

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

Давайте посмотрим на очень простой пример, перевернув строку.

Если я дам вам строку «Зебра» и попрошу перевернуть ее, большинство людей выполнят следующие действия вручную.

  • Напишите «Зебра».
  • Начните новое слово и поставьте «а» в качестве первой буквы. (Почему -> потому что это последняя буква, мы хотим начать здесь)
  • Поместите «r» как вторую букву.(Почему -> потому что это следующая буква в обратном направлении от последней буквы, которую мы скопировали)
  • Поставьте «b» как третью букву. (Почему -> то же, что и выше)
  • Etc

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

Оптимизация решения вручную

Люди часто не осознают, насколько ценен этот шаг. Намного легче перестроить и реконструировать идею или алгоритм в голове, чем в коде.

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

Здесь вы хотите выяснить, есть ли другой способ более легкого решения проблемы, или есть некоторые шаги, которые вы можете сократить или упростить.

Давайте посмотрим на наш пример разворота строки и посмотрим, сможем ли мы упростить шаги.

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

  1. Напишите «Зебра».
  2. Начните с последней буквы в слове и создайте новое пустое слово.
  3. Добавить текущую букву к новому слову
  4. Если есть предыдущая буква, сделайте предыдущую букву текущей и начните снова с 3.

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

Написать псевдокод или комментарии

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

Если вы новичок или боретесь с подобными проблемами, я все равно не тороплюсь и сделаю этот шаг.

Здесь мы хотим зафиксировать все шаги, которые мы создали, и теперь либо поместить их в наш редактор в виде комментариев, либо записать их как псевдокод, который мы можем преобразовать в реальный код.

Делая это, мы можем точно знать, как будет выглядеть структура кода, который мы собираемся написать, что делает работу по заполнению фактического кода впоследствии тривиальной.

Давайте посмотрим на псевдокод для обращения строки.

// NewWord = «»

// Цикл назад по слову для обратного

// NewWord + = CurrentLetter

// Return NewWord

Довольно просто, но главное, что мы здесь сделали, - структуру кода мы напишем для решения проблемы.

Замените комментарии реальным кодом

На данном этапе этот шаг должен быть чрезвычайно простым. Если вы выполнили все остальные шаги, этот шаг вообще не предполагает решения проблем.

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

Если взять переворот строки, мы можем получить что-то вроде этого.

1 за 1 перевод комментариев, которые мы создали выше для реального кода.

Если у вас возникли проблемы, обычно есть две возможные причины:

  1. Вы не разбили проблему на достаточно мелкие шаги
  2. Вы недостаточно хорошо знаете свой язык программирования, чтобы выполнить преобразование

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

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

  • Создать список
  • Сортировать список или массив
  • Создать карту или словарь
  • Прокручивать список , или словарь
  • Анализировать строки
  • Преобразовать из строки в int, из int в строку и т. д.

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

Оптимизируйте реальный код

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

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

Я не буду приводить оптимизацию для нашего тривиального примера переворота строки, но здесь я советую не усложнять. Просто постарайтесь в основном упростить свой код и избавиться от дублирования.

Несколько заключительных советов

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

Единственный способ обрести уверенность в этом процессе - это практиковать его.Требуется большая вера, чтобы поверить в то, что потратить 70% своих 30 минут на решение проблемы, просто думая о проблеме и не писать код, - это правильный подход, поэтому убедитесь, что у вас есть такая вера, когда она вам нужна.

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

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

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

Этот метод решения проблемы называется «разделяй и властвуй» и весьма эффективен. Хороший способ узнать, где разделить проблему пополам, - это подумать о том, какая часть проблемы, если она вам уже дана, упростит решение остальной части.

Интервью по программированию - это просто битва в большой войне: маркетинг себя. Чтобы получить полную информацию, взгляните на мой курс: «Как продвигать себя в качестве разработчика программного обеспечения».

.

Как думать как программист - уроки решения задач

Ричард Рейс

Ричард Рейс

Если вы интересуетесь программированием, возможно, вы уже видели эту цитату раньше:

«Каждый в этой стране должен научиться программировать компьютер, потому что он учит думать». - Стив Джобс

Вы, наверное, тоже задавались вопросом, что именно значит думать как программист? А как это у делаешь ???

По сути, - это все о более эффективном способе решения проблем .

В этом посте моя цель - научить вас этому.

По его окончании вы будете точно знать, какие шаги нужно предпринять, чтобы лучше решать проблемы.

Почему это важно?

Решение проблем - это мета-навык.

У всех есть проблемы. Большой и маленький. То, как мы с ними справляемся, иногда, ну… довольно случайное.

Если у вас нет системы, вероятно, вы «решаете» проблемы следующим образом (что я и сделал, когда начал писать код):

  1. Попробуйте решение.
  2. Если это не помогло, попробуйте другой.
  3. Если это не помогло, повторяйте шаг 2, пока не повезет.

Слушай, иногда тебе везет. Но это худший способ решения проблем! И это огромная, огромная трата времени.

Лучший способ - это а) иметь структуру и б) ее практиковать.

«Почти все работодатели в первую очередь отдают предпочтение навыкам решения проблем.
Навыки решения проблем почти единодушно являются наиболее важной квалификацией, которую ищут работодатели….больше чем языки программирования p
.

простых задач программирования

простых задач программирования

Каждый раз, когда я работаю TA на вводном уроке CS, где студенты изучают какой-либо язык программирования, у меня возникают проблемы с придумыванием хороших упражнений. Задачи из Project Euler и т.п. обычно слишком сложны для начинающих, особенно если у них нет сильного математического образования.

На этой странице собраны все более сложные упражнения, подходящие для людей, которые только начали учиться.Он будет расширяться по мере того, как я буду придумывать новые упражнения. За исключением вопросов о графическом интерфейсе пользователя, упражнения обычно алгоритмические и должны быть решаемы без изучения каких-либо библиотек. Конечно, сложность упражнений в некоторой степени зависит от используемого вами языка программирования. Например, упражнения со списком более сложны в языках типа C, в которых нет встроенной поддержки списков.

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

Это руководство было переведено на китайский язык компанией yifeitao. Простые проблемы программирования на китайском языке

Прежде чем начать

Обучение программированию означает обучение решению проблем с помощью кода. Концептуально нетрудно написать программу, которая решает проблему, которую вы можете решить сами. Навык, который вам необходимо приобрести, - это очень точно продумать, как вы решите проблему, и разбить ее на шаги, которые настолько просты, что компьютер может их выполнить.Я рекомендую вам сначала решить несколько примеров проблемы вручную и подумать о том, что вы сделали, чтобы найти решение. Например, если задача состоит в сортировке списков, отсортируйте некоторые короткие списки самостоятельно. Разумным методом было бы найти наименьший элемент, записать его, вычеркнуть из исходного списка и повторять этот процесс, пока вы не отсортируете весь список. Затем вы должны научить компьютер: 1) как находить наименьший элемент, 2) как его записывать, 3) как вычеркивать его и заключать в цикл.Затем продолжайте этот процесс разбивки задач до тех пор, пока не будете уверены, что знаете, как написать необходимую программу.

Чтобы добиться хороших результатов в выполнении задачи по программированию, вам необходимо протестировать свою работу как можно раньше и как можно тщательнее. Все делают ошибки при программировании, и поиск ошибок в программах занимает очень большую часть рабочего дня программиста. Найти проблему в небольшом и легком фрагменте кода намного проще, чем пытаться обнаружить ее в большой программе. Вот почему вы должны попытаться протестировать каждую подзадачу, которую вы определили во время разбивки задачи, отдельно.Только после того, как вы убедитесь, что каждая часть работает должным образом, вы можете попытаться соединить их вместе. Убедитесь, что вы тестируете также всю программу, ошибки могут закрасться в способ взаимодействия различных частей. Вам следует попытаться автоматизировать свои тесты. Чем проще тестировать вашу программу, тем свободнее вы экспериментируете с изменениями.

Последний важный момент - это , как вы выражаете свои мысли в виде кода. Точно так же, как вы можете выразить один и тот же аргумент по-разному в обычном эссе на английском языке, вы можете выразить один и тот же метод решения проблемы разными способами в коде.Постарайтесь для краткости. Строки, которые вы не пишете, - это строки, в которых вы можете быть уверены, что в них нет ошибок. Не бойтесь искать в Google идиоматические способы делать то, что вы хотите делать (после того, как вы попытались сделать это сами!). Помните, что вы пишете программу не для компьютера, вы пишете ее для других людей (может быть, для вас в будущем!). Выбирайте имена, которые объясняют вещи, добавляйте комментарии, если этих имен недостаточно. Никогда не комментируйте , что делает код , только пишите комментарии, объясняющие , почему .

Это плохой пример:

  // Эта функция проверяет, четное ли число def f (x): // вычисляем x по модулю 2 и проверяем, равен ли он нулю если по модулю (x, 2) == 0: // число четное вернуть True еще: // число нечетное return False  

Точно такую ​​же идею будет намного легче понять, если вы напишете ее так:

  def is_divisible (число, делитель): вернуть по модулю (число, делитель) == 0 def is_even (число): return is_divisible (число, 2)  

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

Элементарно

  1. Напишите программу, которая выводит на экран «Hello World».
  2. Напишите программу, которая запрашивает у пользователя его имя и приветствует его именем.
  3. Измените предыдущую программу таким образом, чтобы только пользователи Алиса и Боб встречались со своими именами.
  4. Напишите программу, которая запрашивает у пользователя число n и выводит сумму чисел от 1 до n
  5. Измените предыдущую программу так, чтобы в сумме учитывались только числа, кратные трем или пяти, например 3, 5, 6, 9, 10, 12, 15 для n = 17
  6. Напишите программу, которая запрашивает у пользователя число n и дает ему возможность выбирать между вычислением суммы и вычислением произведения 1,…, n .
  7. Напишите программу, которая печатает таблицу умножения чисел до 12.
  8. Напишите программу, которая печатает всех простых чисел. (Примечание: если ваш язык программирования не поддерживает числа произвольного размера, вы можете распечатать все простые числа вплоть до самого большого числа, которое вы можете легко представить.)
  9. Напишите игру в догадки, в которой пользователь должен угадать секретное число. После каждого предположения программа сообщает пользователю, было ли их количество слишком большим или слишком маленьким. В конце должно быть напечатано количество необходимых попыток. Если они вводят одно и то же число несколько раз подряд, засчитывается только одна попытка.{k + 1}} {2k-1} = 4 \ cdot (1-1 / 3 + 1 / 5-1 / 7 + 1 / 9-1 / 11 \ ldots).

    Списки, строки

    Если выбранный вами язык не имеет встроенного списка и / или строкового типа (например, вы используете C), эти упражнения также должны быть решаемы для массивов. Однако некоторые решения сильно различаются между списком на основе массива (например, вектор С ++, вектор ) и списком на основе указателя (например, список С ++ ), по крайней мере, если вы заботитесь об эффективности своего кода. Так что вы можете либо найти библиотеку, либо изучить, как реализовать собственный связанный список, если на вашем языке его нет.

    1. Напишите функцию, которая возвращает самый большой элемент в списке.
    2. Функция записи, которая переворачивает список, желательно на месте.
    3. Напишите функцию, которая проверяет, присутствует ли элемент в списке.
    4. Напишите функцию, которая возвращает элементы на нечетных позициях в списке.
    5. Напишите функцию, вычисляющую промежуточную сумму списка.
    6. Напишите функцию, которая проверяет, является ли строка палиндромом.
    7. Напишите три функции, которые вычисляют сумму чисел в списке: с использованием для -цикла, и -цикла и рекурсии.(При наличии этих конструкций на выбранном вами языке.)
    8. Напишите функцию on_all , которая применяет функцию к каждому элементу списка. Используйте его для печати первых двадцати идеальных квадратов. Совершенные квадраты можно найти, умножив каждое натуральное число на себя. Первые несколько полных квадратов: 1 * 1 = 1 , 2 * 2 = 4 , 3 * 3 = 9 , 4 * 4 = 16 . Например, двенадцать не является полным квадратом, потому что не существует натурального числа м , так что м * м = 12 .(Этот вопрос непрост, если ваш язык программирования затрудняет передачу функций в качестве аргументов.)
    9. Напишите функцию, объединяющую два списка. [a, b, c] , [1,2,3] [a, b, c, 1,2,3]
    10. Напишите функцию, которая объединяет два списка, поочередно принимая элементы, например [a, b, c] , [1,2,3] [a, 1, b, 2, c, 3] .
    11. Напишите функцию, которая объединяет два отсортированных списка в новый отсортированный список. [1,4,6] , [2,3,5] [1,2,3,4,5,6] .Вы можете сделать это быстрее, чем объединять их с последующей сортировкой.
    12. Напишите функцию, которая вращает список на k элементов. Например, [1,2,3,4,5,6] , повернутый на два, становится [3,4,5,6,1,2] . Попробуйте решить эту проблему, не создавая копию списка. Сколько операций обмена или перемещения вам нужно?
    13. Напишите функцию, которая вычисляет список первых 100 чисел Фибоначчи. Первые два числа Фибоначчи - это 1 и 1. Число Фибоначчи n + 1 может быть вычислено путем сложения числа Фибоначчи n, и n-1, числа Фибоначчи.Таким образом, первые несколько: 1, 1, 1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8.
    14. Напишите функцию, которая принимает число и возвращает список его цифр. Таким образом, для 2342 он должен вернуть [2,3,4,2] .
    15. Напишите функции, которые складывают, вычитают и умножают два числа в их представлении списка цифр (и возвращают новый список цифр). Если вы амбициозны, вы можете реализовать умножение Карацубы. Пробуй разные базы. Какая лучшая база, если вам важна скорость? Если вы не смогли полностью решить указанное выше упражнение с простыми числами из-за отсутствия больших чисел в вашем языке, теперь вы можете использовать свою собственную библиотеку для этой задачи.
    16. Напишите функцию, которая принимает список чисел, начальную базу b1 и целевую базу b2 и интерпретирует список как число в базе b1 и преобразует его в число с основанием b2 (в форма списка цифр). Так, например, [2,1,0] в базе 3 преобразуется в базу 10 как [2,1] .
    17. Реализуйте следующие алгоритмы сортировки: сортировка по выбору, сортировка вставкой, сортировка слиянием, быстрая сортировка, сортировка Stooge.Поищите описания в Википедии.
    18. Реализовать двоичный поиск.
    19. Напишите функцию, которая принимает список строк и печатает их, по одной в строке, в прямоугольной рамке. Например, список ["Hello", "World", "in", "a", "frame"] печатается как:

        ********* * Привет * * Мир * * в * * а * * Рамка * *********  
    20. Функция записи, которая переводит текст на Pig Latin и обратно. Английский переводится на Pig Latin, беря первую букву каждого слова, перемещая ее в конец слова и добавляя «ау».«Быстрая коричневая лиса» превращается в «Hetay uickqay rownbay oxfay».

    1. Напишите программу, которая выводит все возможности поставить + или - или ничего между числами 1,2,…, 9 (в этом порядке) так, чтобы результат был 100. Например, 1 + 2 + 3 - 4 + 5 + 6 + 78 + 9 = 100
    2. Напишите программу, которая берет продолжительность года (в дробных днях) для воображаемой планеты в качестве входных данных и создает правило високосного года, которое минимизирует разницу в солнечном году планеты.
    3. Реализовать структуру данных для графиков, позволяющую изменять (вставку, удаление). Должна быть возможность хранить значения на краях и узлах. Для этого проще всего использовать словарь (node, edgelist).
    4. Напишите функцию, которая генерирует точечное представление графика.
    5. Напишите программу, которая автоматически генерирует для вас эссе.
      1. Используя образец текста, создайте ориентированный (мульти-) граф, в котором слова текста являются узлами, а между и и v , если за и следует v в вашем образце текст.Множественные вхождения приводят к множеству ребер.
      2. Произведите случайное блуждание по этому графику: начиная с произвольного узла выберите случайного преемника. Если преемника не существует, выберите другой случайный узел.
    6. Напишите программу, которая автоматически преобразует английский текст в азбуку Морзе и наоборот.
    7. Напишите программу, которая находит самую длинную палиндромную подстроку заданной строки. Постарайтесь быть максимально эффективными!
    8. Подумайте о хорошем интерфейсе для списка. Какие операции вам обычно нужны? Возможно, вы захотите изучить интерфейс списка на своем языке и на некоторых других популярных языках для вдохновения.
    9. Реализуйте интерфейс вашего списка, используя фиксированный кусок памяти, скажем, массив размером 100. Если пользователь хочет добавить в ваш список больше, чем умещается в вашей памяти, вы должны выдать какую-то ошибку, например, вы можете выбросить исключение если ваш язык это поддерживает.
    10. Улучшите вашу предыдущую реализацию, чтобы в вашем списке можно было хранить произвольное количество элементов. Вы можете, например, выделять все больше и больше куски памяти по мере роста вашего списка, копировать старые элементы и освобождать старое хранилище.Вам, вероятно, также следует со временем освободить эту память, если ваш список уменьшится настолько, что он больше не понадобится. Подумайте о том, насколько большим должен быть новый кусок памяти, чтобы ваша производительность не снизилась из-за выделения. Например, увеличение размера на 1 элемент - плохая идея.
    11. Если вы правильно выбрали рост в предыдущей задаче, вы обычно не будете распределять ресурсы очень часто. Однако на добавление в большой список иногда уходит много времени. В некоторых приложениях это может быть проблематично.Вместо этого попробуйте выделить новые блоки памяти для новых элементов. Поэтому, когда ваш список полон и пользователь хочет что-то добавить, выделите новый кусок из 100 элементов вместо копирования всех элементов в новый большой кусок. Подумайте, где вести учет имеющихся у вас блоков. Различные стратегии ведения бухгалтерского учета могут существенно изменить характеристики вашего списка.
    12. Реализуйте двоичную кучу. Один раз использовать список в качестве базовой структуры данных и один раз реализовать двоичное дерево, связанное с указателем.Используйте его для реализации сортировки по куче.
    13. Реализовать несбалансированное двоичное дерево поиска.
    14. Реализуйте сбалансированное двоичное дерево поиска по вашему выбору. Мне нравится (a, b) -t
    .

    Не учите кодировать в 2019 году ... (НАУЧИТЕСЬ РЕШИТЬ ПРОБЛЕМЫ)

    Не учитесь программировать в 2019 году. Научитесь решать проблемы вместо этого. Это похоже на то, о чем большинство людей не говорят? Бьюсь об заклад, это так. Но это определенно реальность.

    Я часто вижу это с новичками и опытными разработчиками. Они пытаются изучить все возможные результаты кодирования, учатся программировать на сотне разных языков ... Только для того, чтобы почувствовать себя подавленным.

    И тогда они все еще находят кодирование абсолютно сложной задачей.Но почему это происходит?

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

    Я тоже там был.

    Когда большинство программистов сталкиваются с проблемой программирования на собеседовании, они делают несколько ключевых ошибок. Самая серьезная из них - неправильное распределение времени. Вы слышали поговорку «дважды отмерьте и один раз отрежьте», тогда вы, вероятно, знакомы с идеей заранее потратить время на то, чтобы убедиться, что что-то сделано правильно, а не нырять сразу.

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

    Также поразительно, как много разработчиков, которые не могут написать ни одной строчки кода, могут терпеть неудачу при решении той же проблемы точно таким же образом.

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

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

    Торт для интервью:
    https://simpleprogrammer.com/interviewcake

    John Sonmez Pluralsight Courses:
    https://simpleprogrammer.com/pluralsightjohn

    Cracking The Coding Книга интервью:
    https://simpleprogrammer.com/cracking

    Расшифровка видео

    Джон Сонмез: Не учись программировать.Сегодня я собираюсь рассказать вам об очень важной концепции, которая, я думаю, поможет вам в вашей карьере, а именно об обучении решать проблемы. Так много разработчиков, они сосредоточены на синтаксисе, они сосредоточены на языке, они сосредоточены на обучении «кодированию» или программированию, но не на решении проблем. Я могу сказать вам, почему это так важно, здесь.

    Если вы только присоединяетесь ко мне впервые, я Джон с сайта simpleprogramer.com, и вы находитесь в том месте в Интернете, где можно найти тренинги по soft skills для разработчиков программного обеспечения.Нет никого, кто делал бы это лучше и лучше, чем мы в Simple Programmer. Нажмите эту маленькую кнопку подписки внизу и нажмите колокольчик, чтобы не пропустить ни одно из видео, которые выходят на этом канале.

    Многие новые разработчики, даже многие старшие разработчики не понимают, что вам как разработчику программного обеспечения нужно научиться решать проблемы, а не просто кодировать. Я думаю, что есть реальный акцент, особенно для людей, которые начинают изучать программирование, которые хотят попасть в эту область, есть реальный акцент, чтобы узнать о структуре языка программирования и всем его синтаксисе, и сосредоточиться на этом как важная вещь, которую нужно изучить.На самом деле это не критический навык, потому что как разработчик программного обеспечения, как программист, вы не собираетесь, я имею в виду, важно знать язык, который вы используете, но более важный навык, которым вы собираетесь овладеть. Требуется использовать, и это труднее научиться, так это фактическая способность решать проблемы, разбирать их, а затем переводить в код, верно?

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

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

    Когда у вас есть такая способность, писать код становится действительно легко. Зачем? Потому что на тот момент, когда вы это разбили, это всего лишь простой перевод. Это всего лишь простой перевод, я хочу эту вещь, этот код, который я знаю, и для этого вам даже не нужно знать язык программирования, верно? Вы могли бы буквально иметь возможность разбивать проблемы и разбивать их на мельчайшие элементарные детали, а затем вы могли бы буквально пойти и посмотреть синтаксис и выяснить на этом языке программирования, как написать ту строку кода, которая будет делать это.Фактически, я делал это много раз. Я написал код на языке программирования, о котором ничего не знал, и способ, которым я смог это сделать, заключался в том, что я усовершенствовал навык обучения для решения проблем с поломкой.

    У меня есть несколько ресурсов, на которые я хочу указать. У меня есть компания под названием Interview Cake. Мы разместим ссылку на карточке здесь. Они мои друзья. Они дают вам алгоритмические задачи типа собеседования по кодированию, и это хорошо, если вы понимаете, как это делать.У меня есть курс на Pluralsite, который также научит вас этому и покажет, как это сделать шаг за шагом. Вы можете проверить это. Зарегистрируйтесь на Pluralsite, если еще не сделали этого. И, конечно же, есть книга под названием Cracking the Coding Interview. Я действительно чувствую, что два других ресурса будут немного лучше, потому что они немного более интерактивны, но я бы порекомендовал именно такие вещи.

    Цель этого видео - просто дать вам понять, что, особенно если вы начинаете как новичок или даже если вы в некоторой степени продвинутый программист, но вы боретесь, как и делаете это. Вы не чувствуете себя компетентным, вы не чувствуете, что всегда можете решать проблемы и писать код, вы чувствуете, что можете исправить некоторые ошибки, вы чувствуете, что вроде как получаете, но вы не понимаете, как эти ребята могут любить , как мне самому создать целое приложение? Это вопросы, которые я задавал себе.Как бы я ни был, для меня не имеет смысла, как я могу создать целое веб-приложение, или я мог бы работать над его частью, но я не мог спроектировать и создать все это. Самая большая проблема в том, что все проблемы, верно? Если вы научитесь разбирать проблемы и переводить их, и если вы можете сосредоточиться на этом, вы продвинетесь намного дальше в своей карьере, где так много людей сосредоточено на языке.

    С годами многое изменилось. Я думаю, лет 20 назад или около того, даже когда я только начинал изучать программирование, понимание языка и его синтаксиса было намного важнее, чем сейчас, потому что у вас не было столько ресурсов, и у вас было не так много библиотек, их было много, вы решали проблемы внутри языка, и знание всех тонкостей языка было критически важно.Теперь, как разработчик, это все смешанное, все эти разные технологии. Все меняется из-под вас, поэтому вы должны действительно сосредоточиться на том, чтобы действительно научиться решать проблемы, а затем переводить эту способность на любой язык, в какой бы области она ни находилась. Вы обнаружите, что это все равно. Все равно, если у вас есть этот набор навыков.

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

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

    .

    Смотрите также