У меня была любовь к математике и решению задач с детства, и я хотел бы помочь как можно большему количеству людей тому, чему я научился за свою карьеру. У меня есть определенные подходы и способы мышления, которые могут быть очень полезны для многих из вас. Сначала давайте углубимся в то, что на самом деле представляет собой алгоритм. Это процесс или набор правил, которым необходимо следовать при вычислениях или других операциях по решению проблем, особенно с помощью компьютера. По сути, это способ подхода к проблеме и придания ей структуры, которая всегда будет решать проблемы такого типа.
За время моего обучения математике и компьютерным наукам я встречал множество различных типов алгоритмов. Единственное, что всегда оставалось неизменным во всех них, — это подход. Я разобью на этапы и подробно расскажу о каждом шаге.
- НЕ ПРИКАСАЙТЕСЬ К КЛАВИАТУРЕ.
- Думайте вслух.
- Запишите входные данные, которые вам даны, и ожидаемые результаты.
- Напишите МНОГО примеров.
- Говорите вслух, что именно делает каждый отдельный пример.
- Если вы застряли на том, что не видите закономерности или того, как начать, НЕ ПАНИКУЙТЕ!
- Напишите псевдокод для примеров, которые вы уже записали.
- Говорите вслух, когда пишете! (Не бойтесь показаться сумасшедшим из Starbucks.)
- Если у вас есть представление о решении, попробуйте преобразовать свой псевдокод в функциональный код.
- Если кажется, что все потеряно, начните сначала и попробуйте разные примеры.
Почему я сказал говорить вслух несколько раз? В основном потому, что я никогда этого не делал, и я сидел и стучал головой о стол, когда ударялся о блок. Простое прослушивание собственной речи может помочь вам найти ответ, а также укрепить ваши технические навыки общения.
Другая крупная ошибка, которую я совершил, заключалась в том, что я думал, что точно знаю, как подойти к идее через 10 секунд после того, как проблема была поставлена передо мной, и прыгал прямо в код, даже не нарисовав ничего на схеме или не пройдя процесс, который я изложил выше. Это очень важно, потому что вы убеждаете себя, что ЗНАЕТЕ ответ и, возможно, с самого начала пойдете по неверному пути, а затем не будете знать, как выбрать другой путь.
Пример. Дан массив целых чисел. Найдите максимальное произведение, которое можно получить из трех целых чисел.
Первое, что я бы сделал, это сразу на 3 числа, а затем увидел бы, что наибольшее произведение — это три числа, умноженные вместе. Это может показаться очень тривиальным, но это именно то, что эти числа будут делать для вас.
Теперь я должен думать, что у меня есть?
- Множество
- Целые числа
Чтобы получить наивысший продукт, мне нужно, чтобы числа были большими, поэтому я хочу получить самые большие числа, которые мне дали. Прокрутите и найдите 3 самых больших положительных числа.
Я сделал именно это, но ошибся! Где я ошибся?
Ну, я не думал обо всех вещах, которые мне дали, которые были целыми числами. Которые включают отрицательные числа. Так что теперь я должен подумать, что может дать мне наибольшее число с положительным и отрицательным значением.
Скажем, у нас есть массив:
var array = [-4,-1,1,3,6];
Самое большое число будет -4*-1*6.
Теперь я вижу, что у меня есть два разных случая, поскольку у меня есть 3 числа в качестве желаемого количества факторов. В первом случае были 3 самых высоких положительных числа, во втором случае были два самых низких отрицательных числа и самое большое положительное число.
Может быть трудно показать свои шаги через эту среду, но я говорю вслух на каждом шагу и спрашиваю себя, чего я хочу. Я не могу достаточно повторить, насколько важен этот шаг.
//loop to find 3 biggest pos nums //loop to find 2 smallest neg nums //check which is larger between the two products //return the largest
Ниже показано, как я это закодировал, но, честно говоря, после того, как я рассказал о проблеме и записал более 10 примеров, код написал сам себя. Я использовал этот подход для каждой проблемы, с которой я сталкивался, иногда я терпел неудачу, но я видел резкое увеличение количества успехов, которые у меня были. Кроме того, я научился любить алгоритмические задачи еще больше, потому что больше не злюсь на себя, в основном потому, что у меня есть процесс, которому я следую, и способ обойти блоки.
.
.
.
// Sort to Get 3 Highest and 2 Lowest function highestProduct(array) { if (!array || array.length < 3) { return 0; } array.sort(function(a, b) { return a - b; }); var usingSmalls = array[0] * array[1] * array[array.length - 1]; var usingBigs = array[array.length - 1] * array[array.length - 2] * array[array.length - 3]; return Math.max(usingSmalls, usingBigs); }
Если вы считаете, что это было полезно, дайте мне знать и, пожалуйста, дайте мне отзыв о том, как сделать его лучше. Я хотел бы поделиться любым/всеми своими знаниями, чтобы другие могли узнать некоторые из удивительных вещей, которые мне посчастливилось изучить.