Skip to content

5201314999/algorithm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

56 Commits
 
 
 
 

Repository files navigation

algorithm

记录常规算法题

十大排序

十大经典排序

新增 leetcode 练习笔记

正常人刷 200 道即可

算法题中常遇到的问题

  • 递归,防止死循环和内存泄露。由于递归需要堆栈,所以内存消耗要比非递归代码要大很多。而且,如果递归深度太大,可能系统撑不住。内存会存在突然飙升的情况。如果是数据错误导致无限循环,那问题就大了。所以这方面问题在开发的时候需要注意。 访问数组越界,绝大多数的数组越界,根本原因在于对定义混淆。比如定义的时候想的是“以 0 起始”,但是写的时候写成了“以 1 起始”。究其根本,数组越界的问题,其实是对区间把控的问题。
  • 区间表意不明。 大部分的语言中,数组都以 0 为起始元素,但是人的思维习惯于以 1 为起始。那为什么数组要以 0 为起始元素,历史原因有很多,咱不说。对咱们有用的,3 个。第一,因为我们选择左闭右开区间,比如 [0,n),我们可以很容易通过 n-0 得到数组中元素个数。这点大家要形成条件发射,看到数组,明确其个数。第二,闭区间很难去表示一个空数组,不信你试试,非常难受。第三,左闭右开的区间,迭代器只需要最少的操作符。可以让代码写起来非常的舒服,STL 的算法和容器中基本都是如此。
  • 差一问题(栅栏错误)。 建造一条直栅栏(即不围圈),长 30 米、每条栅栏柱间相隔 3 米,需要多少条栅栏柱? 求数组 A[i]到 A[j] 的平均值,A[i] 到 A[j] 的和应该除以多少,是 j-i+1,还是 j-i?二分法中的 while 条件,到底是用 <= 还是 < ?这些都是差一问题,这类问题如何解决。利用最小的的输入值测试代码的执行过程,长期反复,达到条件反射。这个过程一定是在大量的题目练习中掌握的,如果你到目前还在纠结这个问题,请先扣心自问,是否刷过至少 200 道算法题。如果没有,请不要纠结,干就对了。如果有,来找我。
  • 内存溢出问题。分为两种,一种是因为运算超出变量取值范围发生的内存溢出,比如二分法中的 mid,就要使用 left+(right-left)>>1。另一种就是因为代码不严谨,比如递归没有退出条件,while 死循环,等等导致内存溢出。 初学者定义问题。 比如统计 26 个字母出现的次数,初学者会用 hashmap,其实这种已知值范围的,定义成数组就可以了。其他类似数字 0-9,每个月的天数,都是一样的
  • 写一半忘记题意。 这个根本原因还是因为思维脉络不清晰导致的,有时候初学者还会遇到一个问题。定义一个函数,比如叫做 juge() 返回 bool 值,本来应该是判断某条件成立时返回 true,但是用的时候却以为,在条件不成立的时候返回 true,最终导致结果错误。
  • 变量名错误。 不管是和方法参数中的变量名称冲突,还是因为本身表意不明,最终出现赋值错误,或者编译不通过。
  • 运算优先级错误。 比如位运算,各个语言中的优先级定义是略有不同的。有时候需要加括号,有时候不需要加。 特殊值的处理。 一些找规律的题目,往往在等于 0,等于 1 的时候,规律和其他的数不同,所以这种题目,需要对这种特殊值进行特殊处理。

About

常规算法题记录

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published