Не гледайте отговорите, казват те. Опитайте се да напишете свое собствено решение, казват те.

(Малка история за това защо това е толкова адски трудно.)

Помните ли алгебрата в 7-ми, 8-ми клас? Ще ви дадат уравнение, ще ви кажат, че „това е известно нещо“, след което ще ви дадат задачи, за да практикувате с него. Те биха ви дали „x^2 +2x + 3“ може да се раздели на (x+2)(x+1) и след това ще практикувате с куп стойности. Но от вас никога не се е очаквало да изобретите „рефакторинг на полиномни уравнения“.

Тези дни винаги се стремя да подобря уменията си за javascript. Работил съм като фронтенд инженер от 14 години, но javascript става все по-важен през тези години. Въпреки че чувствам, че разбирам дълбоко как работи браузърът, как работи каскадата на CSS (ммм… трудно!), как да препращам json през javascript tubing и как да преговарям с QA и Product, рутинно съм объркан от общи проблеми с програмирането . Главно защото, като фронтен инженер, за 14 години никога не ми е трябвало да решавам тези проблеми.

Ако интервюирате за преден експерт и го помолите да намери най-дългата празнина в двоичен низ, моят честен отговор е, знаете ли за какво наемате?

Ако някога сте дали на инженер от предния край REST крайна точка, която връща двоични низове, надявам се, че ще имат разума да кажат на момчетата от задния край да го накарат да върне нещо друго. В противен случай току-що сте направили най-лошия си наем.

въпреки това.

„Въпросът“ ви моли да погледнете число като това: 10000010001 (което е двоичното представяне на 1041) и да отчетете какъв е най-дългият участък от 0. В този случай ще бъде 5.

Първата ми грешка беше да се съсредоточа върху 0-те, защото те ги споменават, а не 1-ците.

Мислех си – ще прегледам всяка цифра и ще увеличавам брояч всеки път, когато е 0. Добре. Можем да проверим за граници, 1 от двете страни, по-късно. Но поне ще знаем къде е най-голямата част от 0.

Проблемът е, че с число като 10000010001 ще преброите до 5, след което ще започнете отначало и ще преброите до 3. Така ще загубите най-високата си стойност!

Това ме накара да си помисля: „Трябва да стартирам нов брояч, когато видя ново „1“. Тогава ще имам списък с различни стойности на брояча.

Проблемът с това е, че трябва да декларирате брояч във външния обхват, извън на оператора for. В противен случай просто го нулирате до първоначалната му стойност всеки кръг.

Подкрепих се докрай до НЕВЪЗМОЖНО. Ако започнете да мислите, че искат да преоткриете езика на упражнение от ниво 1, помиришете тази миризма. Това е миризмата на стани, тръгни си, ти си на грешен път.

В този момент наруших правилото. Реших, че съм направил добър опит за наивно решение и имах нужда от следа. Тръгнах да търся отговори.

Може да се изненадате, но това само влоши положението!

Намерих „едно решение“, което предлага изрязване на елементи от последователността, за да следите къде сте. За мен това въвежда допълнителна сложност. Имате известна стока, дължината на оригинала. Защо да се забъркваш с това?

„Друго решение“ използва ред като if(n & 1 === 1)... толкова разстройващо. Какво е n &… & е оператор в javascript? Не мисля така. Искам ли да отида да го потърся, докато съм зает с решаването на друг проблем? Не. Понякога трябва да отидете да потърсите неща, ако не можете да ги прочетете, но не всеки път! Опитвам се да разреша Binary Gap тук.

Тази „много хубава статия“ реши проблема с помощта на рекурсия, която е толкова прекрасна. Освен че не е така. В производството, на предния край, рекурсията НЯКОГА правилният избор ли е? Има ниска наблюдаемост, което означава, че не мога да видя какво е окончателното изчисление, докато не бъде върнато. Рекурсивната функция записва междинни стойности в паметта и не освобождава тази памет, докато не се върне. Не можете да проверите тази памет. Просто не ми харесва. Ако има грешка в изчислението, искам да мога да видя къде се случва (Гласът на учителя по математика: ПОКАЖЕТЕ РАБОТАТА СИ!). И рекурсията не е „като цяло по-бърза“.

Пригответе се за потенциално непопулярно мнение: рекурсията е нещо, което разработчиците правят, за да впечатлят други разработчици.

Може да има добри случаи на използване на рекурсия, но те не са в предния край.

Това, което разбрах от статията за рекурсията, беше, че той се фокусира върху 1-ците, а не върху 0-те. Така че, въпреки че загубих половин час, преразглеждайки колко тъга причинява рекурсията, бях отблокиран.

Фокусирайте се върху 1-цата. Преформулирайте проблема по отношение на пропуски между 1-ци, а не увеличения между 0-ли.

„Взех назаем идеята“ за „разстояния“ и успях да реша 2 от основните случаи: ако имахте всички 1 и следователно нямах пропуски, върнахте 0 и, ако имахте ясен случай на произволно число с 2 1 в него (10001, или 000100000001, или 1001001001), което го прави валидна празнина.

Последният случай беше обработка на низ като „10000000“. В момента моето решение би върнало 6 вместо 0. Моята корекция беше да се уверя, че всеки път, когато правите запис в списъка с разстояния, сте проверявали, за да сте сигурни, че това е последната стойност на разстоянието в изпълнението. Така че не добавяйте запис за тази 0, освен ако не знаете елемента след 1.

Моето решение беше върнало [1,2,3,4,5,1,2,3] преди, което, когато беше сортирано, върна 5 правилно. Но след тази последна корекция, той върна [5,3], което беше още по-просто и също върна 5 правилно (за оригиналното число 10000010001).

Наистина съм доволен от това решение. Няма преобразуване на низа в масив, не е необходимо. Няма използване на 2 указателя, твърде сложно. Няма цикли while или цикли вътре в цикли. И няма странен синтаксис, тайнствени математически методи на javascript или специално обучение, от което се нуждаете, за да прочетете отговора.

Мисля, че новите програмисти наистина се обезсърчават, опитвайки се да измислят наивни решения. Знам, че намирам за супер обезвъздушаващо да се заклещя в ъгъла и да не знам какво да правя, освен да потърся нещата. Трябва да намерите баланс между това да предизвиквате себе си и да се подкрепяте. Щях да бъда супер блокиран, ако продължавах да гледам 0-те, а истинският проблем не бяха уменията ми за програмиране, а моето рамкиране на проблема.

Приятно използване на javascript, приятели на javascript!