Skip to main content

3 начина да побољшате решење за кодирање интервјуа - муза

Anonim

Дакле, ту сте. Ослобођен. Исцрпљени. Коначно сте изнашли приступ за решавање шкакљивог питања кодирања које вам поставља анкетар. Можда сте то чак написали и на табли, ред за редом. И добро сте се провели! Само 20 минута састанка. Твој анкетар мора бити импресиониран.

Јел тако?

"Ово ће успети, али има ли идеја како да се то ефикасније уради?"

Твоје срце тоне. Мислили сте да сте завршили са дизајнираним делом алгоритма за дизајн! Покушавате да смислите више начина да решите проблем, али све што можете смислити је један приступ који сте већ смислили.

То се догађа скоро свима. И није зато што су глупи. То је зато што већина људи нема методу за побољшање ефикасности својих алгоритама.

Али истина је да их има доста. Следећи пут када будете запели, покушајте да примените ова три уобичајена приступа.

1. Користите Хасх Мап

Тако је. Хасх мапе / асоцијативни низови / речници (они иду под многим именима, овисно о томе који програмски језик користите) имају чаробну способност да смање време извођења алгоритама.

На пример, претпоставимо да је питање било пронаћи највише поновљени број у низу бројева.

Ваша прва мисао можда је скочити у неке петље. За сваки од наших бројева смислите број и проверите да ли је највећи. Како долазимо до броја сваког броја? Прегледајте низ, рачунајући колико се пута догоди! Дакле, говоримо о две угнијежђене петље. У псеудо коду:

деф гет_моде (нумс): мак_цоунт = 0 мод = нула за потенцијал_моде у бројевима: цоунт = 0 за број у нашем_арраиу: цоунт + = 1 ако цоунт> = мак_цоунт: моде = потенцијал_моде мак_цоунт = цоунт ретурн моде

Тренутно претражујемо читав низ једном за сваку ставку у пољу - али можемо и боље. У великој О нотацији, укупно је то О (н 2 ) време.

Ако похранимо наше бројеве у хасх мапу (мапирање бројева на њихове бројеве), проблем можемо решити у само једном ходу кроз низ (О (н) времена!):

деф гет_моде (нумс): мак_цоунт = 0 мод = нулл цоунтс = нови ХасхМап, започињући сваку вредност са 0 за потенцијал_моде у бројевима: броји + = 1 ако броји> мак_цоунт: мод = потенцијал_моде мак_цоунт = броји повратни режим

Много брже!

2. Користите Бит манипулацију

Ово ће вас заиста раздвојити од чопора. Не односи се на сваки проблем, али ако ово држите у задњем џепу и истргнете га у правом тренутку, изгледаћете као роцкстар.

Ево примера: Претпоставимо да смо имали низ бројева, где се сваки број појављује два пута, осим једног броја који се појављује само једанпут. Пишемо функцију за проналажење усамљеног, непоновљеног броја.

Ваш први инстинкт можда је употреба хасх мапе, јер смо управо разговарали о томе. То је добар инстинкт! И радиће за ову. Можемо направити врло сличну мапу бројања и користити је да видимо који број се завршава бројем 1.

Али постоји још бољи начин. Ако сте упознати са манипулацијама мало, можда ћете бити упознати са КСОР-ом. Једна ствар која је посебна код КСОР-а је да ако КСОР бројкате са собом, битови „откажу“ на 0. За овај проблем, ако КСОР сваки број заједно у низу, остат ћемо са једним бројем који није не отказујем:

деф финд_унрепеатед (нумс): непоновљено = 0 за нум у бројевима: непоновљено = непоновљено враћање КСОР броја непоновљено

3. Идите одоздо према горе

Напишите функцију која производи „н“ Фибонаццијев број, с обзиром на број н. Овај је класик, и подноси се рекурзији:

деф фиб (н): ако је н 0 или 1: вратите 1 повратну фиб (н-1) + фиб (н-2)

Али једноставан рекурзивни одговор није једини! Добро размислите шта ова функција ради. Претпоставимо да је н 5. Да бисте добили одговор, рекурзивно позива фиб (4) и фиб (3). Е сад, шта ради тај позив фиб (4)? Зове фиб (3) и фиб (2). Али управо смо рекли да већ имамо позив за фиб (3)! Ова симпатична рекурзивна функција ради пуно понављања. Укупни временски трошак испада да је О (2 н ). То је лоше - много горе од О (н 2 ).

Уместо да се с н рекурзивно спуштамо на 1, идемо "одоздо према горе", са 1 на н. Ово нам омогућава да прескочимо рекурзију:

деф фиб (н): претходни = 0 претходни_превидни = 1 за и у опсегу 1 до н: тренутни = претходни + претходни_прегледни претходни_превидњи = претходни претходни = тренутни повратни ток

Код је дужи, али је много ефикаснији! Доле до О (н) времена. Као додатни бонус са размотавањем рекурзивних алгоритама штедимо простор. Сви ти рекурзивни позиви сакупљају се у скупу позива, који сједи у меморији и рачуна се на наше трошкове простора. Наша рекурзивна функција имала је О (н) просторни трошак, али ова итеративна заузима О (1) простор.

Следећи пут када вас саговорник затражи да побољшате ефикасност свог решења, покушајте да прођете кроз ове стратегије и видите да ли помажу. Уз довољно праксе, вероватно ћете наићи на равно на оптимизовано решење, прескачући наивније решење. И то је сјајна ствар. То не значи само да постајете бољи анкетар - то значи да постајете и бољи инжењер.