面试常用的基础算法总结

440 阅读1分钟

事先声明:本文章主要用来准备面试,更多的是写给自己看的,再加上自己写作水平不咋样,写的比较差,但是也欢迎各位大佬的吐糟和改正,本人尽量改正! 算法主要是用go语言实现的(好在go语言相对简单)。后续可能会补充其他语言版本!

最近一段时间面试和刷题经历,让我一度认为自己是个算法渣渣!没办法,既然选择了远方,便只有风雨兼行了!就如高中数学题压轴题一样,简单的问题可以分解成几个小的简单题,大部分复杂的算法题可以通过分解成一个或者多个简单的算法来解决!因此我整理了一些比较基础的算法,希望能学以致用,举一反三,从而事半功倍!

二分查找法

二分法常常用来在有序数组查找一个数,他的前提是输入的数组是有序的(即数组是排过序的)。本质思想是每次都减少一半的搜索范围。代码示例如下

func binarySearch(arr []int, target int) int {
    left, right := 0, len(arr)-1
    for left <= right {
        mid := (left + right) / 2
        if arr[mid] == target {
            return mid
        } else if target < arr[mid] {
            right = mid - 1
        } else {
            left = mid + 1
        }
    }
    return -1
}

判断一个数是否是质数

一个数如果满足以下两个条件:

  • 是大于1的自然数
  • 只能被1和它本身整除

则是质数。

判断一个数是否是质数,最简单的方法是暴力法,如下所示:

func isPrime(n int) bool {
    if n <= 1 {
        return false
    }
    for i := 2; i < n; i++ {
        if n%i == 0 {
            return false
        }
    }
    return true
}

实际上可以进一步优化。比如所有偶数都能被2整除,那么可以排除掉所有偶数(2除外)。此外,根据合数的定义,我们可以发现有

假设c是一个合数,则存在正整数满足一下条件
    1 < a <= b < c 
=>
    a*a < c
=>
    a < sqrt(c)

既判断n是否是质数,我们只要判断到sqrt(n)就行来

func isPrime(n int) bool {
    if n <= 1 {
        return false
    }
    if n == 2 {
        return true
    } else if n%2 == 0 {
        return false
    }
    t := int(math.Sqrt(float64(n)))
    for i := 2; i <= t; i++ {
        if n%i == 0 {
            return false
        }
    }
    return true
}

最小公倍数

最大公约数

树的遍历:宽度优先和深度优先搜索

背包问题

\