Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

AltStyle によって変換されたページ (->オリジナル) /