DEV Community

Andrew
Andrew

Posted on

I’ve changed everything.

Right now, I am not using AI to translate my Russian writings of this blog. I am writing it right away, since I don’t have time for that bullsh. I have too much work and other responsibilities, that I am managing to complete, when most of others would probably give up. I am on one path for 4 weeks right now.

I did 4 algorithms as always. Last one was Fibonacci Number, and before that Climbing Stairs. I still used AI to give me a full and amazing explanation of every result’s code part. I read it, fully understand it, then write my own pseudocode with thoughts and explanations to myself.

I can leave here these two last algos, how I’ve approached them when I forgot some details after reading with understanding the explanation.

class Solution {
public:
    int fib(int n) {
        /* 
            *В задачах на Fibonacci используется как показано в условии формула (n-1)+(n-2)
            Но начинается данная последовательность с 0 и 1.
            = Мне нужно пройтись по всему массиву чисел до n. Есть n допустим равное 3.
              В таком случае (F(3-1) + F(3-2)) + (F(2-1)+F(2-2)), но в начале должны быть 0 и 1.
            = Нужно создать переменную - вектор чисел для хранения резу...Либо, можно пойти с конца
              и тогда вместо сохранения элементов в массиве, можно будет сначала запихнуть в
              в две переменные (prev и current) 0 и 1 соответственно.
            = В начатом цикле...ага или же можно идти с конца и присвоить prev = n-1, а 
              current = n - 1; В цикле, если n меньше 2, то сразу вывести n, в другом случае
              result = prev + current; А потом prev--, и current--;
            = Для n равного 4, будет 1.)result = 3+2; 2.)2+1; 3.)1
            = Нет, легче будет сделать: prev = 0; current = 1; В цикле: result = prev + current;
              prev = current; current = result. А в конце вывести result
            = Для n равного 4, будет 0.)result = 0+1=1; 1.)1+1=2; 2.)1+2=3; 3.)2+3=5;
            = Тоже нужно вывести в конце current (тогда вместо result можно назвать next)
            = Можно использовать while (--n) {} цикл для такого случая, тк индекс не используется
            Итак:
            - int prev = 0; int current = 1; int next;
            - while (--n) {}, или скорее while (n--), чтобы также дойти до 0-вого индекса
            - Внутри цикла next = prev + current; А также prev = current; current = next;
            - В конце вывод return previous (да, ведь в конце current становится next...);
            - А так как next постоянно меняется внутри цикла и ему только нужны новые значения,
              то можно для читаемости и контроля кода сделать int next = ... в каждой итерации
        */

        int prev = 0;
        int current = 1;
        while (n--) {
            int next = prev + current;
            prev = current;
            current = next;
        }
        return prev;
    }
};
Enter fullscreen mode Exit fullscreen mode
class Solution {
public:
    int climbStairs(int n) {
        /* 
            * Есть n шагов до верха лестницы (количество шагов)
            * Каждый раз можно сделать либо 1, либо 2 шага
            * n от 1 до 45
            * каждый шаг имеет два способа поднятия на него (шаг на 1, или шаг на 2), кроме 
              первого шага, который имеет только один способ оказаться на нём.
            = Мне нужно пройтись по циклу от 0(шага) до n(последнего шага)
            = На каждой итерации мне нужно будет засчитать возможность попадания на эту ступень
              из поз-апрошлой ступени, и также из прошлой. Формулой было бы -> step = (n-2) + (n-1)
            = В конце мне нужно будет вывести текущее значение всех посчитанных шагов вместе после
              полного прохождения цикла.
            = В самом начале нужно сделать так, чтобы посчитался только один шаг - первый шаг (до 
              него ступеней ещё не было)
            = Для этого, нужно иметь переменную, хранящую прошлый шаг и текущий.
            = Имея прошлый шаг сначала равный 0, и текущий, тоже допустим! равный 0, в таком случае
              в первой итерации steps = currentStep + previousStep. Но именно поэтому currentStep
              может быть в начале равен 1. Либо, можно попробовать сделать steps = i + previousStep 
              (где i допустим начнётся не с нуля, а с 1).
            = Во втором способе, steps будет при массиве [0, 3] = 1.)1; 2.)...
              Ага, и тут нужно добавлять также и в previousStep, чтобы он не оставался равным 
              всегда 0, а также двигался по лестице - соответственно, previousStep = i в конце.
            = Теперь, steps будет при массиве [0, 3] = 1.)1; 2.)i+(i-1)=1; 3.)...
            = Всё таки нужно что-то изменить. Добавить переменную previousStep = 0, и 
              currentStep = 1; в самом начале
            = Теперь steps будет при массиве [0, 3] = 1.)0+1; 2.)...;
            = Нужно переопределить previousStep и currentStep после текущей итерации, что nextStep
             тоже учитывался, и в итоге производился переход на следующую ступень.
            = previousStep = currentStep; currentStep = step;
            = Теперь steps будет при массиве [0, 3] = 0.)0+1=1; 1.)1+1=2; 2.)1+2=3 3.)2+3=5;
            = В конце вывести currentStep? (ведь 5 это уже следующий шаг, своего рода nextStep)
            = Да, в таком случае можно назвать вместо step - nextStep.
            Итак:
            - Две переменные previousStep = 0; currentStep = 1;
            - Цикл for (int i = 0; i < n; ++i) {}
            - Внутри цикла nextStep = previousStep + currentStep
            - После этого также внутри цикла previousStep = currentStep; currentStep = nextStep;
            - После цикла вывод return currentStep.

            P.S - Если бы я лучше знал шаблоны, то распознал бы задачу на Fibonnaci sequence, 
            а тогда я мог бы дойти до решения в 2-4 раза быстрее.
        */

        int prevStep = 0;
        int currentStep = 1;
        int nextStep;
        for (int i = 0; i < n; ++i) {
            nextStep = prevStep + currentStep;
            prevStep = currentStep;
            currentStep = nextStep;
        }
        return currentStep;
    }
};
Enter fullscreen mode Exit fullscreen mode

Yea it’s Russian, but I don’t give a d. Nobody would read it anyway. I will probably just re-read this some day and recollect some more.

I was also reading about 5 CS topics, including: Von Neumann and Harvard’s architectures; Registers (flags, general purpose); Pipelining, Branch prediction and an Arithmetic logic unit ALU.

With Chinese words it’s a little bit trickier, since after I’ve added more to my work schedule, I could not manage to find time for everything, so I still know 500–550 words, but I need to repeat and learn already familiar words, so I could get to 600 and even 700 this time. I’ll do that, since I have slowly found my pase and flow in everything.

I also do my own startup, which is just in a well…starting point. But I am already proud of doing next steps and staying on one course no matter what. I have my own Notes that include the year+ plan, and all the motivation with other important stuff keeping me on that road to first success. At the end of it all, you need to succeed only once, just like Drew Houston, and Mark Cuban were saying.

That’s it, I am going to complete the tone of my job from the previous week, and also start that new one from Monday. I was actually afraid of becoming a bad programmer, but that fear made me think more about: security, maintenance, cleanliness (readability), correctness (best practices) and complete understanding of what I am doing, why, how, where etc.

You can follow my path to a huge one of a Tech Entrepreneur with good programming skills person. Independent and fully organized in terms of everything in life. Well, maybe except of my zero interest on any romantic relationships (probably I am asexual, but never mind…).

Yea, let’s get it then.

Top comments (0)