常见的算法

1 求出等于目标值的数的下标
func main(){
    list:=[]int{1,3,6,9,34,67,99}
    t:=10
    for i:=len(list)-1;i>=0;i--{
        for j:=0;j<i;j++{
            if list[i]+list[j]==t{
                fmt.Println("[索引下标是]____:",i,j) // 0,3
            }
        }
    }
}

2 快排

  • python版本
def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    else:
        p = arr[len(arr)//2]    
        left = [x for x in arr if x < p]
        middle = [x for x in arr if x == p]
        right = [x for x in arr if x > p]
        return quick_sort(left) + middle + quick_sort(right)


if __name__ == "__main__":
    arr = [12,11,4,66,99,107,202]
    v = quick_sort(arr)
    print(v)
  • go版本
func main(){
    li := []int{54, 26, 93, 55, 77, 31, 44, 55, 20}
    qulckSort(li,0,len(li)-1)
    fmt.Println(li) // [20 26 31 44 54 55 55 77 93]
}
func qulckSort(li []int, start,end int){
    if start >= end{
        return
    }
    left:=start
    right:=end
    baseValue := li[left]
    for left<right{
          for left<right && li[right]>=baseValue{
              right-=1
          }
          li[left]=li[right]
          for left<right && li[left] < baseValue{
              left+=1
          }
          li[right]=li[left]
    }
    li[left] = baseValue
    qulckSort(li, start, left-1)
    qulckSort(li, left+1, end)
}
3 冒泡排序
func main(){
    s:=[]int{2,4,1,8,9,9,6,0}
    for i:=0;i<=len(s)-1;i++{
        flag:=false
        for j:=0;j<len(s)-1-i;j++{
            if s[j] > s[j+1]{
                s[j],s[j+1] = s[j+1],s[j]
                flag=true
            }
        }  
        if flag==false{
            break
        }
    }
    fmt.Println(s) // [0,1,2,4,6,8,9,9]
}
4 选择排序
// 选择排序 (不断的跟左右比较,找到最小的下标的值,记录下来交换位置)
func main(){
    s:=[]int{2,4,6,9,11,22,3}
    for i:=0;i<=len(s)-1;i++{
        index:=i
        for j:=i+1;j<len(s);j++{
            if s[j]<s[index]{
                index=j
            }
        }
        if index!=i{
            s[index],s[i] = s[i],s[index]
        }
    }
    fmt.Println(s) // [2 3 4 6 9 11 22]
}
5 对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数0 0;当 A[i] 为偶数时,i也是偶数
func main(){
    result:=[]int{4,2,5,7}
    list:=make([]int, len(result))
    a,b:=0,0
    for i:=0;i<=len(result)-1;i++{
         if result[i]%2==0{
              list[b] = result[i]
              b +=2
         }else{
              list[a]=result[i]
              a+=2
         }
    }
    fmt.Println(list) // [4 5 2 7]
}
6 计算字符串中不重复的最长子串的长度 abcabcbb ==3
func main(){
    str:="pwwkew"
    max := 0
    m:=make(map[byte]int)
    for i,j:=0,0;j<len(str);j++{
        if v,ok := m[byte(str[j])];ok{
            if i<v{
                i=v
            }
        }
        if max<j-i+1{
            max=j-i+1
        }
        m[byte(str[j])] = j+1
    }
    fmt.Println("【最长的不重复的字符串长度为】___:",max) // 3
}
7 求中位数
func main(){
    fmt.Println(m()) // [2 4] [3] ==>[3]
}
func m()float64{
    num1 := []int{2,4}
    num2 := []int{3}
    num1 = append(num1, num2...)
    n:=len(num1)
    for i:=0;i<n;i++{
        for j:=0;j<i;j++{
            if num1[j]>num1[j+1]{
                num1[j],num1[j+1] = num1[j+1],num1[j]
            }
        }
    }
    if n%2==0 {
        return float64((num1[n/2] + num1[n-1]))/2
    }else{
        return float64(num1[n/2])
    }
}
8 切片数字反转
// 输入:[1 2 3 4 5]   输出:[5 4 3 2 1]
func main(){
    s := []int{11,33,22,55,66}
    for i,j:=0,len(s)-1;i<j;i,j = i+1, j-1{
          s[i],s[j]=s[j],s[i]
    }
    fmt.Println("反转后的切片__:",s) //[66 55 22 33 11]
}
9 求素数
func main(){
    // 找1000内的素数
    origin, wait := make(chan int), make(chan struct{})
    Processor(origin, wait)
    for num:=2;num<1000;num++{
        origin <- num
    }
    close(origin)
    <- wait
}
func Processor(origin chan int, wait chan struct{}){
    go func() {
        data, ok := <-origin
        if !ok{
            close(wait)
            return
        }
        fmt.Println(212,data)
        out := make(chan int)
        Processor(out, wait)

        for num := range origin{
            if num%data != 0{
                out<-num
            }
        }
        close(out)
    }()
}

//简单求素数写法
func main(){
    p := make([]int, 0)
    for i:=2;i<100;i++{
        for v:= range p{
            if i%p[v]== 0 && p[v] > 1{
                goto flag
            }
        }
        p = append(p, i)
        flag:
    }
    fmt.Println("求素数__:", p)
}

。。。。。。
# Python语法:
def Prime(num):
    a=[1 for i in range(0,num+1)]
    for i in range(2, int(num**.5)+1):
        if a[i]:
            j=i
            while j*i<=num:
                a[i*j]=0
                j+=1
   m = [i for i in range(2,num+1) if a[i]]
   return m  # num=10  -->[2, 3, 5, 7]
10 容量为K的大顶堆
//  大顶堆就是子节点比父节点小的树,堆化就是父节点跟子节点发生交换
type heap struct{
    m []int
    len int
}
func main() {
    m := []int{0,9,3,6,2,1,7} //第0个下标不放目标元素
    h := buildHeap(m) //建堆,返回一个heap结构
    h.Push(50)
    h.Pop()
    fmt.Println(h.m) // [0 9 3 7 2 1 6 7]
}
func buildHeap(m []int) *heap{
    n := len(m)-1
    for i:=n/2; i>0; i-- {
        heapf(m, n, i)
    }
    return &heap{m,n}
}
func (h *heap)Push(data int) {
    h.len++
    h.m = append(h.m, data)//向切片尾部插入数据(推断出父节点下标为i/2)
    i := h.len
    for i/2 >0 && h.m[i/2]<h.m[i] { //自下而上的堆化
        h.m[i/2], h.m[i] = h.m[i], h.m[i/2]
        i = i/2
    }
}
func (h *heap)Pop() int{
    if h.len < 1 {
        return -1
    }
    out := h.m[1]
    h.m[1] = h.m[h.len] //把最后一个元素给堆顶
    h.len--
    //对堆顶节点进行堆化即可
    heapf(h.m, h.len, 1)
    return out
}
//对下标为i的节点进行堆化, n表示堆的最后一个节点下标
//2i,2i+1
func heapf(m []int, n,i int) {
    for {
        maxPos := i
        if 2*i<= n && m[2*i] > m[i] {
            maxPos = 2*i
        }
        if 2*i+1 <=n && m[2*i+1] > m[maxPos] {
            maxPos = 2*i + 1
        }
        if maxPos == i { //如果i节点位置正确,则退出
            break
        }
        m[i],m[maxPos] = m[maxPos],m[i]
        i = maxPos
    }
}
11 单链表反转
type ListNode struct {
    data interface{}
    Next *ListNode
}
//反转单链表
func reverseList(head *ListNode) *ListNode {
    var pre *ListNode
    for head != nil {
        head.Next, pre, head = pre, head, head.Next
    }
    return pre
}
func CreateNode(node *ListNode, max int) {
    for i := 1; i < max; i++ {
        node.Next = &ListNode{}
        node.Next.data = i
        node = node.Next
    }
}
//打印链表的方法
func PrintNode(info string, node *ListNode) {
    fmt.Print(info,"\n")
    for cur := node; cur != nil; cur = cur.Next {
        fmt.Print(cur.data, " ")
    }
}
func main() {
    var head = new(ListNode)
    CreateNode(head, 10)
    PrintNode("前:", head)
    node := reverseList(head)
    PrintNode("后:", node) //1 2 3 4 5 6 7 8 9---> 9 8 7 6 5 4 3 2 1
}

获取数组里最长子串的总和

func main() {
    s := []int{-2,1,-1,2,4,1,-5,4}
    var maxSum int
    for i:=0;i<len(s);i++{
        sum:=0
        for j:=i;j<len(s);j++{
            sum+=s[j]
            if sum>maxSum{
                maxSum=sum
            }
        }
    }
    fmt.Println(maxSum) //7
}

二维数组顺时针螺旋迭代成一维数组

func main() {
    a:=[][]int{
        {1,2,3,4},
        {7,8,9,10},
        {3,4,5,6},
    }  
    s:=f1(a)
    fmt.Println(s) // [1 2 3 4 10 6 5 4 3 7 8 9]
}

func f1(a [][]int)[]int{
    dir,row,col := 1,0,0
    top,right,bottom,left := 0, len(a[0])-1, len(a)-1,0
    s:=make([]int, 0)

    for top<=bottom && left <= right{
        s = append(s, a[row][col])
        switch dir{
        case 1:
            if col==right{
                dir=2
                top++
                row++
                continue
            }
            col++
        case 2:
            if row==bottom{
                dir=3
                right--
                col--
                continue
            }    
            row++
        case 3:
            if col==left{
                dir=4
                bottom--
                row--
                continue
            }    
            col--
        case 4:
            if row==top{
                dir=1
                left++
                col++
                continue
            }    
            row--
        }
    }
    return s
}

斐波拉切数列

func main(){
    s := "1,1,2,3,5,8,13,21,34,55"
    for i:=1;i<len(s);i++{
        fmt.Println(f1(i))
    }
}
func f1(n int)int{
    if n < 2{
        return n
    }
    return f1(n-2)+f1(n-1)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容