代码随想录 学习记录(1)

简介: 代码随想录 学习记录(1)

https://www.programmercarl.com/

建议大家按照章节顺序阅读本书,在阅读的过程中会发现我在题目编排上的良苦用心!本书不仅在题目编排上精心设计,而且在针对读者最头痛的算法问题上做了详细且深入的讲解。关于动态规划,都知道递推公式的重要性,但dp数组的含义、dp数组的初始化、遍历顺序以及如何打印dp数组来排查Bug,这些都很重要。例如,解决背包问题的时候,遍历顺序才是最关键的,也是最难理解的。关于回溯算法,题目要求集合之间不可重复,那么就需要去重,各种资料都说要去重,但没有说清楚是“树层去重”还是“树枝去重”——这是我为了说明去重的过程而创造的两个词汇。

关于KMP算法,都知道使用前缀表进行回退,可什么是前缀表,为什么一定要用前缀表,根据前缀表回退有几种方式,这些却没有说清楚,导致最后大家看的一头雾水。关于二叉树,不同的遍历顺序其递归函数究竟如何安排,递归函数什么时候需要返回值,什么时候不用返回值,什么情况下分别使用前、中、后序遍历,迭代法又要如何实现,这些都决定了对二叉树的理解是否到位。同时我针对每一个专题的特点,整理出其通用的解法套路。例如:在二叉树专题中,总结了递归“三部曲”来帮助读者掌握二叉树中各种遍历方式的写法。回溯算法中的回溯“三部曲”可以帮助读者理解回溯算法晦涩难懂的过程。动态规划中的动规“五部曲”可以帮助读者在一套思考框架下去解决动态规划题目。再来说一说动态规划,在程序员面试中,动态规划是公认的最难掌握的算法,也是出现频率最高的算法。如果仅仅讲解几道题目,即使再举一反三也远远达不到真正理解动态规划的程度。如果把动态规划的题目单纯地堆砌在一起,也只会让人越学越懵,陷入“一看就会,一写就废”的怪圈。

讲清楚一道题容易,讲清楚两道题也容易,但把整个动态规划的各个分支讲清楚,把每道题目讲透彻,并用一套方法论把整个动态规划的题目贯彻始终就有难度了。而帮助大家解决这个问题,这也是这本书的使命所在。

数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。

答疑

一些算法新手可能疑惑,先刷剑指offer还是先看代码随想录呢? 建议先看 代码随想录,因为剑指offer的题目太少,技巧性还可以,但各个专题不够系统。 所以先看代码随想录,对整个算法各个专题都有整体认知之后,再去看剑指offer,一定会事半功倍! 算法零基础小白想快速入门看代码随想路是不是一道题了解一种方法就行。比如二叉树的各种遍历递归和迭代总是忘记,有些题的解法也很多种。 小白的话,一道题目 了解一种解法就够了,优先把代码随想录 刷完,先整体有一个了解,然后二刷的时候,可以在去思考第二种解法之类的

代码风格

代码规范

变量命名

这里我简单说一说规范问题。 权威的C++规范以Google为主,我给大家下载了一份中文版本,在公众号「代码随想录」后台回复:编程规范,就可以领取。 具体的规范要以自己团队风格为主,融入团队才是最重要的。

我先来说说变量的命名。 主流有如下三种变量规则: 小驼峰、大驼峰命名法 下划线命名法 匈牙利命名法 小驼峰,第一个单词首字母小写,后面其他单词首字母大写。例如 int myAge; 大驼峰法把第一个单词的首字母也大写了。例如:int MyAge; 通常来讲 java和go都使用驼峰,C++的函数和结构体命名也是用大驼峰,大家可以看到题解中我的C++代码风格就是小驼峰,因为leetcode上给出的默认函数的命名就是小驼峰,所以我入乡随俗。 下划线命名法是名称中的每一个逻辑断点都用一个下划线来标记,例如:int my_age,下划线命名法是随着C语言的出现流行起来的,如果大家看过UNIX高级编程或者UNIX网络编程,就会发现大量使用这种命名方式。

匈牙利命名法是:变量名 = 属性 + 类型 + 对象描述,例如:int iMyAge,这种命名是一个来此匈牙利的程序员在微软内部推广起来,然后推广给了全世界的Windows开发人员。 这种命名方式在没有IDE的时代,可以很好的提醒开发人员遍历的意义,例如看到iMyAge,就知道它是一个int型的变量,而不用找它的定义,缺点是一旦改变变量的属性,那么整个项目里这个变量名字都要改动,所以带来代码维护困难。

目前IDE已经很发达了,都不用标记变量属性了,IDE就会帮我们识别了,所以基本没人用匈牙利命名法了,虽然我不用IDE,VIM大法好。

我举一些例子: 操作符左右一定有空格,

例如 i = i + 1;

分隔符(, 和;)前一位没有空格,后一位保持空格,

例如: int i, j;
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++)

大括号和函数保持同一行,并有一个空格例如:

while (n) {
    n--;
}
控制语句(while,if,for)后都有一个空格,例如: while (n) {
    if (k > 0) return 9;
    n--;
}

是我刚写的力扣283.移动零的代码,大家可以看一下整体风格,注意空格的细节!

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
            if (nums[fastIndex] != 0) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        for (int i = slowIndex; i < nums.size(); i++) {
            nums[i] = 0;
        }
    }
};

一行? Google规范是 大括号和 控制语句保持同一行的,我个人也很认可这种写法,因为可以缩短代码的行数,特别是项目中代码行数很多的情况下,这种写法是可以提高阅读代码的效率。 当然我并不是说一定要按照Google的规范来,代码风格其实统一就行,没有严格的说谁对谁错。

总结

如果还是学生,使用C++的话,可以按照题解中我的代码风格来,还是比较标准的。

如果不是C++就自己选一种代码风格坚持下来, 如果已经工作的录友,就要融入团队的代码风格了,团队怎么写,自己就怎么来,毕竟不是一个人在战斗。

就酱,以后我还会陆续分享,关于代码,求职,学习工作之类的内容。

究竟什么时候用库函数,什么时候要自己实现

如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。 如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,那么直接用库函数。

使用库函数最大的忌讳就是不知道这个库函数怎么实现的,也不知道其时间复杂度,上来就用,这样写出来的算法,时间复杂度自己都掌握不好的。

例如for循环里套一个字符串的insert,erase之类的操作,你说时间复杂度是多少呢,很明显是O(n^2)的时间复杂度了。

在刷题的时候本着我说的标准来使用库函数,相信对大家会有所帮助!

什么是核心代码模式,什么又是ACM模式?

面试究竟怎么考?

笔试的话,基本都是 ACM模式。 面试的话,看情况,有的面试官会让你写一个函数实现就可以,此时就是核心代码模式。 有的面试官会 给你一个编辑器,让你写完代码运行一下看看输出结果,此时就是ACM模式。

有的录友想,那我平时在力扣刷题,写的是核心代码模式,我也可以运行,为啥一定要用ACM模式。 大家在力扣刷题刷多了,已经忘了程序是如何运行的了,力扣上写的代码,脱离力扣环境,那个函数,你怎么运行呢? 想让程序在本地运行起来,是不是需要补充 库函数,是不是要补充main函数,是不是要补充数据的输入和输出。 那不就是ACM模式了。 综合来看,** ACM模式更考察综合代码能力, 核心代码模式是更聚焦算法的实现逻辑**。

https://kamacoder.com/

力扣上如何自己构造二叉树输入用例?

https://www.programmercarl.com/前序/ACM模式如何构建二叉树.html#java

人生苦短,我用VIM!| 最强vim配置

PowerVim

程序员应该用什么用具来写文档?

为什么需要markdown 大家可能想为什么要使用markdown来写文档,而不用各种可以点击鼠标点点的那种所见即所得的工具来记笔记,例如word,云笔记之类的。 首先有如下几点: Markdown可以在任何地方使用 可以使用它来创建网站,笔记,电子书,演讲稿,邮件信息和各种技术文档 Markdown很轻便 事实上,包含Markdown格式文本的文件可以被任何一个应用打开。

如果感觉不喜欢当前使用的Markdown渲染应用,可以使用其他渲染应用来打开。 而鲜明对比的就是Microsoft Word,必须要使用特定的软件才能打开 .doc 或者 .docx的文档 而且可能还是乱码或者格式乱位。 Markdown是独立的平台 你可以创建Markdown格式文本的文件在任何一个可以运行的操作系统上 Markdown已经无处不在 程序员的世界到处都是Markdown,像简书,GitChat, GitHub,csdn等等都支持Markdown文档,正宗的官方技术文档都是使用Markdown来写的。 使用Markdown不仅可以非常方便的记录笔记,而且可以直接导出对应的网站内容,导出可打印的文档 至于markdown的语法,真的非常简单,不需要花费很长的时间掌握!

而且一旦你掌握了它,你就可以在任何地方任何平台使用Markdown来记录笔记,文档甚至写书。 很多人使用Markdown来创建网站的内容,但是Markdown更加擅长于格式化的文本内容,使用Markdown 根部不用担心格式问题,兼容问题。

很多后台开发程序员的工作环境是linux,linux下写文档最佳选择也是markdown。 我平时写代码,写文档都习惯在linux系统下进行(包括我的mac),所以我更喜欢vim + markdown。 关于vim的话,后面我也可以单独介绍一波!

揭秘互联网大厂研发流程

https://www.programmercarl.com/前序/互联网大厂研发流程.html#_1-需求文档

一个项目从开发到上线到后面的维护,从流程上就保证大家少出错,也方便后面人继续维护。

手把手带你实现存储引擎

https://www.programmercarl.com/qita/kvstore.html

一台服务器有什么用!

https://www.programmercarl.com/qita/server.html#搭建git私服

搭建git私服

大家平时工作的时候一定有一个自己的工作文件夹,学生的话就是自己的课件,考试,准备面试的资料等等。 已经工作的录友,会有一个文件夹放着自己重要的文档,Markdown,图片,简历等等。

这么重要的文件夹,而且我们每天都要更新,也担心哪天电脑丢了,或者坏了,突然这些都不见了。 所以我们想备份嘛。 还有就是我们经常个人电脑和工作电脑要同步一些私人资料,而不是用微信传来传去。 这些都是git私服的使用场景,而且很好用。

大家也知道 github,gitee也可以搞私人仓库 用来备份,同步文件,但自己的文档可能放着很多重要的信息,包括自己的各种密码,密钥之类的,放到上面未必安全。

你就不怕哪些重大bug把你的信息都泄漏了么[机智] 更关键的是,github 和 gitee都限速的。毕竟人家的功能定位并不是网盘。 项目里有大文件(几百M以上),例如pdf,ppt等等 其上传和下载速度会让你窒息。 后面我会发文专门来讲一讲,如何大家git私服!

搞一个文件存储

这个可以用来生成文件的下载链接,也可以把本地文件传到服务器上。

相当于自己做一个对象存储,其实云厂商也有对象存储的产品。 不过我们自己也可以做一个,不够很多很同学应该都不知道对象存储怎么用吧,其实我们用服务器可以自己做一个类似的公司。 我现在就用自己用go写的一个工具,部署在服务器上。

用来和服务器传文件,或者生成一些文件的临时下载链接。 这些都是直接命令行操作的, 操作方式这样,我把命令包 包装成一个shell命令,想传那个文件,直接 uploadtomyserver,然后就返回可以下载的链接,这个文件也同时传到了我的服务器上。

网站

做网站,例如 大家知道用html 写几行代码,就可以生成一个网页,但怎么给别人展示呢?

大家如果用自己的电脑做服务器,只能同一个路由器下的设备可以访问你的网站,可能这个设备出了这个屋子 都访问不了你的网站了。 因为你的IP不是公网IP。 如果有了一台云服务器,都是配公网IP,你的网站就可以让任何人访问了。 或者说 你提供的一个服务就可以让任何人使用。 例如第二个例子中,我们可以自己开发一个文件存储,这个服务,我只把把命令行给其他人,其他人都可以使用我的服务来生成链接,当然他们的文件也都传到了我的服务器上。

再说一个使用场景。 我之前在组织免费里服务器的活动的时候,阿里云给我一个excel,让面就是从我这里买服务器录友的名单,我直接把这个名单甩到群里,让大家自己检查,出现在名单里就可以找我返现,这样做是不是也可以。 这么做有几个很大的问题: 大家都要去下载excel,做对比,会有人改excel的内容然后就说是从你这里买的,我不可能挨个去比较excel有没有改动 excel有其他人的个人信息,这是不能暴漏的。

如果每个人自己用excel查询,私信我返现,一个将近两千人找我返现,我微信根本处理不过来,这就变成体力活了。 那应该怎么做呢, 我就简单写一个查询的页面,后端逻辑就是读一个execel表格,大家在查询页面输入自己的阿里云ID,如果在excel里,页面就会返回返现群的二维码,大家就可以自主扫码加群了。

这样,我最后就直接在返现群里 发等额红包就好了,是不是极大降低人力成本了 当然我是把 17个返现群的二维码都生成好了,按照一定的规则,展现给查询通过的录友。 就是这样一个非常普通的查询页面。 查询通过之后,就会展现返现群二维码。

但要部署在服务器上,因为没有公网IP,别人用不了你的服务。

学习linux

一文手把手教你搭建Git私服

https://www.programmercarl.com/qita/gitserver.html#为什么要搭建git私服

目录
相关文章
|
6月前
|
算法 容器
代码随想录训练营 | 一刷总结
代码随想录训练营 | 一刷总结
96 1
|
6月前
|
设计模式 芯片 异构计算
FPMM(一):序言
FPMM(一):序言
92 0
|
存储 搜索推荐 Java
《代码随想录》刷题笔记——数组篇【java实现】
《代码随想录》刷题笔记——数组篇【java实现】
95 0
|
存储
《操作系统概论》第一遍阅读
前言: 《操作系统概论》从操作系统实现资源管理的观点出发,产生如何对计算机系统中的软硬件资源进行管理,要求我们理解操作系统要做什么,怎么样去做。学习操作系统概论是在米老师给我们讲完《信息资源管理》学习后按照老师所讲的方法来学习的,所以这次阅读,都是按照老师的指导一步一脚一脚印完成的。感觉很好。
|
算法
代码随想录算法训练营第十一天 | LeetCode1047——栈
代码随想录算法训练营第十一天 | LeetCode1047——栈
81 0
想学python函数,这篇笔记你学废了吗?
执行特定任务和完成特定功能的一段代码。
想学python函数,这篇笔记你学废了吗?
|
缓存 Java 数据库连接
Myabtis源码如何阅读,教你一招!!!
Myabtis源码如何阅读,教你一招!!!
|
Java
代码随想录训练营第十二天 | 栈与队列
代码随想录训练营第十二天 | 栈与队列
83 0
|
算法
代码随想录算法训练营第八天 | 字符串
代码随想录算法训练营第八天 | 字符串
85 0
|
算法
代码随想录算法训练营第四天 | 链表 + 每日一题
代码随想录算法训练营第四天 | 链表 + 每日一题
113 0