三万字《算法零基础入门》跟着我做完这 50 件事,相信定会脱胎换骨,浴火重生 (建议收藏)

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三万字《算法零基础入门》跟着我做完这 50 件事,相信定会脱胎换骨,浴火重生 (建议收藏)相关的知识,希望对你有一定的参考价值。

前言

  很多人加我都是想询问如何学好算法。我的方法是我用了 十年 的时间,自己总结出来的,不可能适合所有人,但是我觉得挺有效的,如果你觉得可行,尽管一试!
  首先,我们心中要有一团🔥火🔥,一团希望之🔥火🔥!只要你心中充满希望,即使是死去的意志也会在你内心复活。
  你永远无法弥补你的过去,但是,你可以改变你的未来!就算暗淡无光的尘土,也会有爆发光芒的那一刻!抓住那尘埃中的刹那光辉,燃烧自己吧!

点击我跳转末尾 获取 粉丝专属 《算法和数据结构》源码,以及获取博主的联系方式。


一、树立目标

  给自己树立一个「 目标 」是非常重要的,有「 目标 」才会有「 方向 」,有「 目标 」才会有「 动力 」,有「 目标 」才会有「 人生的意义 」。有了「 目标 」,再做一定的「 规划 」,并且「 坚持 」做下去,我相信,「 成功的一天终会到来 」

  目标可以是:刷一万道题、学会一百个算法、拿到字节的 offer、年入百万 等等,因人而异,当然,不建议以 财务自由 作为目标,因为每个人对 财务自由 的定义不同。

二、如何开始

  我不是很推崇从一开始就看 《算法导论》 这样的天书,没错,对于初学者而言,这就是天书。在对算法没有任何概念的情况,看书并不是一个明智的选择。
  那么问题来了,不看书,我们看什么呢?
  第一阶段我是这么规划的:
   1)挑一门自己想学习的语言;
   2)零基础情况下,把 50 个简单题先刷掉;
   3)遇到不会的,先想10分钟,想不出来看「 解题报告 」;
   4)看完后一定要自己敲一遍,并且放到重刷列表;
   5)重新刷之前 50 个题里面你看了「 解题报告 」的题;


接下来才是本文的重点内容。

文章目录

三、找到组织

  说了这么多,只是想建立一个「 愿景 」。这个「 愿景 」就是 —— 「 群人皆佬,共赴大厂 」
  光有「 愿景 」是不够的,我们需要「 付诸实际行动 」,任何一项大工程都不是「 一朝一夕 」能够完成的,「 制定计划 」 是尤为重要的事情。例如,想要学好算法,至少需要掌握一门语言,可以是 C、C++、Python、Java。这里强烈推荐 C语言,因为俗话说得好:

「 学好C语言,走遍天下都不怕 」

  为了 「 督促大家 」更好的学习,所以我建立了一些团队供各位 「 技术交流 」之用,因为团队大了不好带,所以初期就把团队分好组,这样每个团队都能有很好的照顾,比一下子吃成胖子要好得多,当然每个团队我都会挑选一些 「 精英人员 」作为领袖,以便更好的来达成我们共同的 「 愿景 」
  这主要是提供给各位志想同道合之士交流沟通的一个桥梁,起到 「 媒介 」的作用。让同样和我 「 志同道合 」的人积极投身到这个事业中来,将祖国的 「 算法 」发扬光大,背靠祖国,面向国际,强我国威,壮我河山!
  用 「 算法 」改变世界, 「 让天下没有难学的算法 」
  我不希望你是以粉丝的身份加入我的团队,我更希望我们是 「 合伙人 」,只是没有任何利益上的输送,我也不会在里面做任何产品的推销,所以, 「 广告商勿扰 」
  大多都是正在上大学的学生,我不想赚学生的钱,毕竟能上学已属不易。而且,很多大学生的激情, 「 引燃 」了我自己的 「 青春 」,所以我很喜欢和大学生交流,有时候也会给他们一些面试以及职场上的建议,久而久之,就成了 「 无话不谈 」的好朋友。
  正是这一点,让我激发了认识更多的人的欲望,毕竟, 「 活到老学到老 」「 靠近优秀的人,使自己变得更加优秀 」,始终保持一个学习的态度,多沟通交流,让自己 「 更加强大 」
  各位成员是有明确共同目标的,这样才能共同成长,大致特征如下:

  如果你满足以上任意一点,那么,我们就是志同道合的人啦!请通过 「 博主的CSDN主页 」 找到联系方式,联系博主。

四、零基础算法

1、求1+2+…+n

1. 问题描述

  求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

2. 问题分析
  首先,题目要求不用乘法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。那如果我用了会怎么样?答案是并不会怎么样,因为平台不会去对它做语法分析,只是调用了你的函数,提供一些输入数据,如果输出数据和它给定的相同,就算通过。
  作为你接触算法的第一道题,其实这些条件都无所谓的,能过就行,他只检测输入输出,不检测你实际代码。
  对于新人来说,把问题过掉比问题本身更重要,题数的增加,是信心的增加,信心比什么都重要,有了信心,你才能继续往下走,只要你能往下推进,你才能继续学习,继续学习你迟早会学到相应的算法。好了,过了这题以后,把这道题放入你的重刷列表,等你对算法有一定理解以后再来用题目要求的方法来过了它。

3. 源码详解

int sumNums(int n){
    return n * (n+1) / 2;  // (1)
}

   ( 1 ) (1) (1) 公差为 1 的等差数列求和公式,完事;


2、递归乘法

1. 问题描述

  递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。

2. 问题分析
  第一题做的时候,我说过什么来着?别想太多,记住,你还是小白的时候,千万不要想太多,绕过平台规则自由的飞翔,让你的进度往前推进,有信心以后再回来巩固和提高。

3. 源码详解

int multiply(int A, int B){
    return A * B;      // (1)
}
  • ( 1 ) (1) (1) 管他什么递归乘法,直接上乘法运算符;

3、斐波那契数

1. 问题描述

  斐波那契数,通常用 F ( n ) F(n) F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 0 0 1 1 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F ( 0 ) = 0 , F ( 1 ) = 1 F ( n ) = F ( n − 1 ) + F ( n − 2 ) , ( 1 < n ≤ 30 ) F(0) = 0,F(1) = 1 \\\\ F(n) = F(n - 1) + F(n - 2), (1 \\lt n \\le 30) F(0)=0F(1)=1F(n)=F(n1)+F(n2),(1<n30) 给你 n n n ,请计算 F ( n ) F(n) F(n)

2. 问题分析
  这个问题考察的是数组的递推,把 F ( i ) F(i) F(i) 理解成 C语言的数组,用 f [ i ] f[i] f[i] 来表示第 i i i 个斐波那契数,然后就是一个循环就可以解决了。

3. 源码详解

int f[31];                         // (1)
int fib(int n) {
    f[0] = 0;                      // (2)
    f[1] = 1;                      // (3)
    for(int i = 2; i <= n; ++i) {
        f[i] = f[i-1] + f[i-2];    // (4)
    }
    return f[n];                   // (5)
}
  • ( 1 ) (1) (1) 定义一个全局的辅助数组;
  • ( 2 ) − ( 3 ) (2)-(3) (2)(3) 初始化 F ( 0 ) = 0 , F ( 1 ) = 1 F(0) = 0,F(1) = 1 F(0)=0F(1)=1,分别存储到数组的第 0 个和第 1 个位置;
  • ( 4 ) (4) (4) 一层循环模拟递推公式;
  • ( 5 ) (5) (5) 返回第 n n n 个值 f [ n ] f[n] f[n],也就是斐波那契数列第 n n n 项;

4、n 的第 k 个因子

1. 问题描述

  给你两个正整数 n n n k k k,其中两者范围为 1 ≤ k ≤ n ≤ 1000 1 \\le k \\le n \\le 1000 1kn1000。如果正整数 i i i 满足 n % i == 0,那么我们就说正整数 i i i 是整数 n n n 的因子。考虑整数 n n n 的所有因子,将它们 升序排列 。请你返回第 k k k 个因子。如果 n n n 的因子数少于 k k k ,请你返回 − 1 -1 1

2. 问题分析
  首先,对于 n n n 这个范围,它的因子数撑死 1000 1000 1000 个,实际上会少很多很多,有兴趣可以自己证明下,当然 夜深人静写算法(三)- 初等数论入门 也有关于因子相关的详细内容,不再累述。所以我们可以从 1 1 1 n n n 枚举,看哪些是 n n n 的因子,然后再用一个计数器计数,直到数到第 k k k 个就是我们需要求的答案了。
  如果全部枚举完,计数器都没有到 k k k,那么很显然,没有 k k k 个因子,直接返回 − 1 -1 1 即可。

3. 源码详解

int kthFactor(int n, int k){
    int i, cnt = 0;             // (1)
    for(i = 1; i <= n; ++i) {   // (2)
        if(n % i == 0) {        // (3)
            ++cnt;              // (4)
            if(cnt == k)
                return i;       // (5)
        }
    }
    return -1;                  // (6)
}
  • ( 1 ) (1) (1) 定义 c n t cnt cnt 为因子计数器;
  • ( 2 ) (2) (2) 1 1 1 n n n 枚举;
  • ( 3 ) (3) (3) 找到所有是 n n n 的因子的数 i i i
  • ( 4 ) (4) (4) 计数器加一;
  • ( 5 ) (5) (5) 如果计数器为 k k k 说明找到了第 k k k 个因子为 i i i,返回 i i i
  • ( 6 ) (6) (6) 如果全部枚举完,计数器都没有到 k k k,那么很显然,没有 k k k 个因子,直接返回 − 1 -1 1 即可;

5、统计平方和三元组的数目

1. 问题描述

  一个 平方和三元组 ( a , b , c ) (a,b,c) (a,b,c) 指的是满足 a 2 + b 2 = c 2 a^2 + b^2 = c^2 a2+b2=c2 的 整数 三元组 a a a b b b c c c。给你一个整数 n ( n ≤ 250 ) n(n \\le 250) n(n250),请你返回满足 1 ≤ a , b , c ≤ n 1 \\le a, b, c \\le n 1a,b,cn 的 平方和三元组 的数目。

2. 问题分析
  首先,考虑最暴力的方法,就是三个数都枚举,然后判断等式是否成立,这样做的时间复杂度为 O ( n 3 ) O(n^3) O(n3)。但是我们可以明显的知道, c c c 一定是最大的,所以在枚举 c c c 的时候,可以从 a a a b b b 当中的大者开始,并且当 a 2 + b 2 < c 2 a^2 + b^2 \\lt c^2 a2+b2<❤️三万字《十大算法入门》❤️

❤️三万字详解《十大入门算法》突击刷掉这几个题,面试不慌!❤️(附源码,建议收藏)

从0开始入门python一个半月的三万字学习笔记汇总!!!

网络安全零基础入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。

跟着小蚂蚁学编程

跟着小蚂蚁学编程