馬哥高端Go語言百萬併發高薪班/微服務/分佈式高可用/Go高併發5期

愛分享 愛生活 加油 2021 

百度網盤golang

提取碼:qhhv 編程

 

這是劍指offer的一道題。數組

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建出以下圖所示的二叉樹並輸出它的頭結點。架構

思路以下:併發

  • 中序遍歷中根節點以前的節點屬於左子樹,以後爲右子樹。
  • 前序遍歷的第一個節點爲根節點。
  • 前序遍歷結果的排列爲:根節點-左子樹節點-右子樹節點
  • 拆分出左子樹和右子樹遞歸重複上述過程
package main

import (
    "fmt"
)

// 重建二叉樹

type Node struct {
    value int64
    left *Node
    right *Node
}

func main() {
    preOrder := []int64{1,2,4,7,3,5,6,8}
    inOrder := []int64{4,7,2,1,5,3,8,6}

    tree := constructBTree(preOrder, inOrder)
    
    //將構建好的二叉樹 輸出先序遍歷和中序遍歷的結果 用於檢驗
    preCatTree(tree)
    inCatTree(tree)
}

//重建二叉樹
func constructBTree(preOrder, inOrder []int64) *Node{
    l := len(preOrder)
    if l == 0{
        return nil
    }

    root := &Node{
        value:preOrder[0],
    }
    if l == 1{
        return root
    }

    leftLen := 0
    rightLen := 0
    for _,v := range inOrder{
        if v == root.value{
            break
        }
        leftLen++ //根節點以前的爲左子樹長度
    }
    rightLen = l - leftLen - 1 //右子樹長度

    if leftLen > 0{
        //fmt.Println("左子樹",preOrder[1:leftLen+1], inOrder[0:leftLen]) //可打開註釋查看詳細過程
        root.left = constructBTree(preOrder[1:leftLen+1], inOrder[0:leftLen])
    }
    if rightLen >0{
        //fmt.Println("右子樹",preOrder[leftLen+1:], inOrder[leftLen+1:])
        root.right = constructBTree(preOrder[leftLen+1:], inOrder[leftLen+1:])
    }

    return root
}


func preCatTree(t *Node) {
    fmt.Println(t.value)
    if t.left!=nil{
        preCatTree(t.left)
    }
    if t.right!=nil{
        preCatTree(t.right)
    }
}
func inCatTree(t *Node) {
    if t.left!=nil{
        inCatTree(t.left)
    }
    fmt.Println(t.value)
    if t.right!=nil{
        inCatTree(t.right)
    }
}



作的
1.格式輸出異步

- %T 類型
- %t 布爾
- %d 10進制整數
- %x 16進制整數
- %f     浮點數
- %s     字符串
2.接口ide

一個類若是實現了一個接口的全部函數,那麼這個類就實現了這個接口,即這個類的對象可使用接口的方法。函數

3.init性能

包的init 是初始化函數,在包引入的時候就會調用,一個包能夠寫多個init函數。翻譯

init 函數先於main函數自動執行,不能被其餘函數調用;
init 函數沒有輸入參數、返回值;
每一個包能夠有多個init函數;
同一個包的init執行順序,golang沒有明肯定義,編程時注意不要依賴這個執行順序,不一樣包的init函數的執行順序依照包導入的依賴關係決定執行順序。

4.執行順序

 

5.多參數函數

 

6.類型轉換

類型(變量)

 

7.引用

獲取指針類型的所指向的值, 可使用: 「*」取值符號。

好比 var p *int, 使用p獲取p指針,slice、map、chan都是引用類型。

內置函數 new 計算類型大小,爲其分配零值內存,返回指針。而 make 會被編譯器翻譯 成具體的建立函數,由其分配內存和初始化成員結構,返回對象而非指針。

8.切片

 

9.類成員函數

 

10.接口

若是兩個接口有相同的方法列表,那麼他們就是等價的,能夠相互賦值。

11.鎖

當一個goroutine(協程)得到了Mutex後,其餘gorouline(協程)就只能乖乖的等待,除非該gorouline釋放了該Mutex
RWMutex在 讀鎖 佔用的狀況下,會阻止寫,但不阻止讀
RWMutex在 寫鎖 佔用狀況下,會阻止任何其餘goroutine(不管讀和寫)進來,整個鎖至關於由該goroutine獨佔

12.通道

若是給一個 nil 的 channel 發送數據,會形成永遠阻塞

若是從一個 nil 的 channel 中接收數據,也會形成永久愛阻塞

給一個已經關閉的 channel 發送數據, 會引發 pannic

從一個已經關閉的 channel 接收數據, 若是緩衝區中爲空,則返回一個零值

無緩衝的 channel是同步的,而有緩衝的channel是非同步的。

13.通道關閉

通道關閉後,若是通道里面仍然有值,就會繼續讀取,直到沒有值,讀取到false

給一個關閉的通道傳遞值會引發panic

若是給一個 nil 的 channel 發送數據,會形成永遠阻塞,靠協程進行疏通

若是從一個 nil 的 channel 接收數據,會形成永久阻塞,靠協程進行疏通

14.斷言類型

x.(T)被稱爲斷言類型,這裏x表示一個接口的類型和T表示一個類型


15.繼承

在一個結構體裏面加一個架構體,就是繼承

16.switch

go 當中switch語句和其餘語言相似,只是有一個特殊的地方,switch後面能夠不跟表達式

 

17.make與new

new返回的是指針

make用於slice map channel初始化,返回實例

18異同Printf(),Sprintf(),FprintF()

Printf()格式化輸出到屏幕

Sprintf()格式化輸出到變量

FprintF()輸出到文件

19.數組與切片

數組定長值傳遞長度也是類型的一部分

切片變長引用傳遞  make初始化   

20.數組與切片的傳遞

數組是值傳遞,只能硬改值,若是是調用函數在函數內改變值的話,就不會達到目的。

切片是引用值,能夠硬改,若是調用函數在函數內部的變化,也會反映到函數外部,它意味着[]切片類型默認使用了*切片。

21.runtime.GOMAXPROCS(邏輯CPU數量)

runtime.GOMAXPROCS 的做用是:調整併發的運行性能。 runtime.Gosched()

<1: 不修改任何數值。
=1: 單核心運行。
>1: 多核心運行。

 

22.defer執行順序

 

23.切片

 

24.異步全局與局部變量

均爲輸出10, 第一個go func中i是外部for的一個變量,地址不變化。遍歷完成後,最終i=10。

故go func執行時,i的值始終是10。

 

25.接口

結構體的空不是空  不等於nil

package main import (    "fmt") type People interface {}type Student struct {}   func live() People {    // 這個是結構體類型的    var stu *Student    return stu     // 這個是接口類型的    var stu People    return stu} func main() {    var a People    fmt.Println(live())    fmt.Println(a)     if a == nil {        fmt.Println("A")    } else {        fmt.Println("B")    }     if live() == nil {        fmt.Println("C")    } else {        fmt.Println("D")    }     b:=live()    if b == nil {        fmt.Println("E")    } else {        fmt.Println("F")    }}// <nil>// <nil>// A// D

相關文章
相關標籤/搜索