剑指offer_Go版

剑指offer_Go版

前言

要工作了 大概率是写Go

我记得今年3 4 月份就想着搞个go版剑指offer一直拖到现在

仅仅go语法基础 还是几个月前学的 现在回顾下 2020/11/13留

2020/11/16留 更新差不多一半了

2020/11/17留 快完结了 准备开高性能sql和进阶go

2020/11/18留 写不动了弃坑 空了一些题 有些不能交go 有些太过偏门题跳过了 略过的不多

剑指 Offer 03. 数组中重复的数字

func findRepeatNumber(nums []int) int {
    for i, num := range nums {
        if i == num {
            continue
        }
        if nums[num] == num {
            return num
        }
        nums[num], nums[i] = nums[i], nums[num]
    }
    return -1
}

剑指 Offer 05. 替换空格

func replaceSpace(s string) string {
    var res string
    for key, val := range s{
        if val == ' ' {
            res += "%20"
        } else {
            res += s[key:key + 1]
        }
    }
    return res
}

剑指 Offer 06. 从尾到头打印链表

递归

func reversePrint(head *ListNode) []int {
    if head == nil {
        return nil
    } else {
        return append(reversePrint(head.Next), head.Val)
    }
}

迭代

func reversePrint(head *ListNode) []int {
    var res []int
    for ; head != nil; head = head.Next {
        res = append(res, head.Val)
    }
    for i, l := 0, len(res); i < l / 2; i = i + 1{
        res[i], res[l - i - 1] = res[l - i - 1], res[i]
    }
    return res
}

剑指 Offer 07. 重建二叉树

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func buildTree(preorder []int, inorder []int) *TreeNode {
    if len(preorder) == 0 {
        return nil
    }
    idx := 0
    for i := range inorder {
        if inorder[i] == preorder[0] {
            idx = i
            break
        }
    }
    root := &TreeNode{Val : preorder[0]}
    root.Left = buildTree(preorder[1 : idx + 1], inorder[ : idx])
    root.Right = buildTree(preorder[idx + 1 : ], inorder[idx + 1 : ])
    return root
}

剑指 Offer 09. 用两个栈实现队列

type CQueue struct {
    s1, s2 *list.List
}

func Constructor() CQueue {
    return CQueue {
        s1:list.New(), s2:list.New(),
    }
}

func (this *CQueue) AppendTail(value int)  {
    this.s1.PushBack(value)
}

func (this *CQueue) DeleteHead() int {
    if this.s2.Len() == 0 { // s1 元素扔入2中
        for this.s1.Len() > 0 {
            this.s2.PushBack(this.s1.Remove(this.s1.Back()))
        }
    }
    if this.s2.Len() > 0 {
        tmp := this.s2.Back()
        this.s2.Remove(tmp)
        return tmp.Value.(int)
    }
    return -1
}

/**
 * Your CQueue object will be instantiated and called as such:
 * obj := Constructor();
 * obj.AppendTail(value);
 * param_2 := obj.DeleteHead();
 */

剑指 Offer 10- I. 斐波那契数列

可以记忆化搜 防超时 看了下题解都没这样写的

var dp [105]int
func fib(n int) int {
    if dp[n] != 0 {return dp[n]}
    if n < 2 {
        return n
    } else {
        dp[n] = (fib(n - 1) + fib(n - 2)) % (1e9+7)
        return dp[n]
    }
}

剑指 Offer 10- II. 青蛙跳台阶问题

func numWays(n int) int {
    return fib(n)
}

var dp [105]int
func fib(n int) int {
    if dp[n] != 0 {return dp[n]}
    if n <= 1 {
        return 1
    } else {
        dp[n] = (fib(n - 1) + fib(n - 2)) % (1e9+7)
        return dp[n]
    }
}

剑指 Offer 11. 旋转数组的最小数字

func minArray(numbers []int) int {
    l := 0
    r := len(numbers) - 1
    for l < r {
        mid := (l + r) / 2
        if(numbers[mid] < numbers[r]) {
            r = mid
        } else if(numbers[mid] == numbers[r]) {
            r = r - 1
        } else {
            l = mid + 1
        }
    }
    return numbers[l]
}

剑指 Offer 12. 矩阵中的路径

func exist(board [][]byte, word string) bool {
    n := len(board)
    m := len(board[0])
    l := len(word)
    for i := 0; i < n; i ++ {
        for j := 0; j < m; j ++ {
            if(dfs(n, m, board, l, word, i, j, 0)) {
                return true
            }
        }
    }
    return false
}

func dfs(n int, m int, board [][]byte, l int,word string, x int, y int, p int) bool { 
    if(p == l) {
        return true
    }
    if x < 0 || y < 0 || x >= n || y >= m {
        return false
    }
    if(board[x][y] == word[p]) {
        t := board[x][y]
        board[x][y] = ' '
        res := dfs(n, m, board, l, word, x + 1, y, p + 1) || dfs(n, m, board, l, word, x - 1, y, p + 1) ||
               dfs(n, m, board, l, word, x, y - 1, p + 1) || dfs(n, m, board, l, word, x, y + 1, p + 1)
        board[x][y] = t
        return res
    } else {
        return false
    }
}

剑指 Offer 13. 机器人的运动范围

开始在语法上蛋疼

func chk(x int, y int, m int, n int) bool {
    return x < 0 || y < 0 || x >= m || y >= n
}

func BitSum(x int) int {
    res := 0
    for x > 0 {
        res += x % 10
        x /= 10
    }
    return res
}

type P struct{
    A, B int
}

func movingCount(m int, n int, k int) int {
    res := 0
    que := list.New()
    que.PushBack(&P{0, 0})
    var vis [105][105]bool
    for que.Len() > 0 {
        p := que.Front()
        que.Remove(p)
        x := p.Value.(*P).A
        y := p.Value.(*P).B
        if chk(x, y, m, n) || vis[x][y] == true || BitSum(x) + BitSum(y) > k { continue }
        vis[x][y] = true
        res ++
        que.PushBack(&P{x + 1, y})
        que.PushBack(&P{x, y + 1})
    }
    return res
}

剑指 Offer 14- I. 剪绳子

最优: 3 把绳子尽可能切为多个长度为 3 的片段
次优: 2 若最后一段绳子长度为 2 ;则保留,不再拆为 1+1
最差: 1 若最后一段绳子长度为 1 ;则应把一份 3 + 1 替换为 2 + 2
2 + 2 == 1 + 3 && 2 * 2 > 1 * 3

func cuttingRope(n int) int {
    if n <= 3 {
        return n - 1
    }
    a, b := n / 3, n % 3
    if b == 0 {
        return int(math.Pow(3, float64(a)))
    } else if b == 1 {
        return int(math.Pow(3, float64(a - 1)) * 4)
    } else {
        return int(math.Pow(3, float64(a)) * 2)
    }
}

剑指 Offer 14- II. 剪绳子 II

注意取模

func q_pow(a, b int) int {
    res := 1
    mod := int(1e9 + 7)
    for b != 0 {
        if b & 1 == 1 {
            res = res * a % mod
        }
        a = a * a % mod
        b >>= 1
    }
    return res
}

func cuttingRope(n int) int {
    mod := int(1e9 + 7)
    if n <= 3 {
        return n - 1
    }
    a, b := n / 3, n % 3
    if b == 0 {
        return int(q_pow(3, a))
    } else if b == 1 {
        return int(q_pow(3, a - 1) * 4) % mod
    } else {
        return int(q_pow(3, a) * 2) % mod
    }
}

剑指 Offer 15. 二进制中1的个数

func hammingWeight(num uint32) int {
    res := 0
    for num > 0 {
        if num & 1 == 1 { res ++ }
        num >>= 1
    }
    return res
}

剑指 Offer 16. 数值的整数次方

func q_pow(a float64, b int) float64 {
    res := 1.0
    if b < 0 {
        a = 1.0 / a
        b = -b
    }
    for b != 0 {
        if b & 1 == 1 {
            res = res * a
        }
        a = a * a
        b >>= 1
    }
    return res
}

func myPow(x float64, n int) float64 {
    return q_pow(x, n)
}

剑指 Offer 19. 正则表达式匹配

var dp [][]int

func isMatch(s string, p string) bool {
    dp = make([][]int, len(s) + 1)
    for i := 0; i < len(dp); i ++ {
        dp[i] = make([]int, len(p) + 1)
        for j := 0; j < len(p) + 1; j ++{
            dp[i][j] = -1;
        }
    }
    return sol(s, p, 0, 0)
}

func sol(s string, p string, x int, y int) bool {
    if dp[x][y] != -1 { return dp[x][y] == 1 }
    if y == len(p) { 
        if x == len(s) {
            dp[x][y] = 1
            return true
        } else {
            dp[x][y] = 0
            return false
        }
    }
    match := x < len(s) && (s[x] == p[y] || p[y] == '.')
    var tmp bool
    if y + 1 < len(p) && p[y + 1] == '*' {
        tmp = ( (match && sol(s, p, x + 1, y) ) || sol(s, p, x, y + 2))
    } else {
        tmp = match && sol(s, p , x + 1, y + 1)
    }
    return tmp
}

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

func exchange(nums []int) []int {
    st, ed := 0, len(nums) - 1
    for st < ed {
        for st < ed && nums[st] % 2 == 1 { st ++ }
        for st < ed && nums[ed] % 2 == 0 { ed -- }
        nums[st], nums[ed] = nums[ed], nums[st]
        st ++
        ed --
    }
    return nums
}

剑指 Offer 22. 链表中倒数第k个节点

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func getKthFromEnd(head *ListNode, k int) *ListNode {
    f := head
    p := 0
    for f != nil && p < k {
        f = f.Next
        p ++
    }
    for f != nil {
        f = f.Next
        head = head.Next
    }
    return head
}

剑指 Offer 25. 合并两个排序的链表

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
    p1, p2 := l1, l2
    dummy := ListNode{-1, nil}
    p := &dummy
    for p1 != nil && p2 != nil {
        if p1.Val < p2.Val { 
            p.Next = p1
            p1 = p1.Next
        } else { 
            p.Next = p2
            p2 = p2.Next
        }
        p = p.Next
    }
    if p1 != nil { 
        p.Next = p1 
    } else { p.Next = p2 }
    return dummy.Next
}

剑指 Offer 26. 树的子结构

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSubStructure(A *TreeNode, B *TreeNode) bool {
    return A != nil && B != nil && (dfs(A, B) || isSubStructure(A.Left, B) || isSubStructure(A.Right, B))
}

func dfs(A *TreeNode, B *TreeNode) bool {
    if B == nil { return true }
    if A == nil || A.Val != B.Val { return false }
    return dfs(A.Left, B.Left) && dfs(A.Right, B.Right)
}

剑指 Offer 27. 二叉树的镜像

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func mirrorTree(root *TreeNode) *TreeNode {
    if root == nil { return nil }
    root.Left, root.Right = root.Right, root.Left
    mirrorTree(root.Left)
    mirrorTree(root.Right)
    return root
}

剑指 Offer 28. 对称的二叉树

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSymmetric(root *TreeNode) bool {
    return dfs(root, root)
}

func dfs(t1 *TreeNode, t2 *TreeNode) bool {
    if t1 == nil && t2 == nil { return true }
    if t1 == nil || t2 == nil || t1.Val != t2.Val { return false }
    return dfs(t1.Left, t2.Right) && dfs(t1.Right, t2.Left)
}

剑指 Offer 29. 顺时针打印矩阵

func spiralOrder(matrix [][]int) []int {
    if len(matrix) == 0 { return []int{} }
    rows, cols := len(matrix), len(matrix[0])

    vis := make([][]bool, rows)
    for i := 0; i < rows; i ++ {
        vis[i] = make([]bool, cols)
    }

    tot := rows * cols
    res := make([]int, tot)
    cxy := [][]int{[]int{0, 1}, []int{1, 0}, []int{0, -1}, []int{-1, 0}}
    c := 0

    for i, x, y := 0, 0, 0; i < tot; i ++ {
        res[i] = matrix[x][y]
        vis[x][y] = true
        nx := x + cxy[c][0]
        ny := y + cxy[c][1]
        if(nx < 0 || ny < 0 || nx >= rows || ny >=cols || vis[nx][ny]) {
            c = (c + 1) % 4
        }
        x = x + cxy[c][0]
        y = y + cxy[c][1] 
    }
    return res
}

剑指 Offer 30. 包含min函数的栈

type MinStack struct {
    min_stack, stack *list.List
}
/** initialize your data structure here. */
func Constructor() MinStack {
    return MinStack {
        min_stack:list.New(),
        stack:list.New(),
    }
}

func Min(x, y int) int {
    if x < y {
        return x
    }
    return y
}

func (this *MinStack) Push(x int)  {
    this.stack.PushBack(x)
    if this.min_stack.Len() == 0 {
        this.min_stack.PushBack(x)
    } else {
        this.min_stack.PushBack(Min(this.min_stack.Back().Value.(int), x))
    }
}


func (this *MinStack) Pop()  {
    this.stack.Remove(this.stack.Back())
    this.min_stack.Remove(this.min_stack.Back())
}


func (this *MinStack) Top() int {
    return this.stack.Back().Value.(int)
}

func (this *MinStack) Min() int {
    return this.min_stack.Back().Value.(int)
}

/**
 * Your MinStack object will be instantiated and called as such:
 * obj := Constructor();
 * obj.Push(x);
 * obj.Pop();
 * param_3 := obj.Top();
 * param_4 := obj.Min();
 */

剑指 Offer 31. 栈的压入、弹出序列

func validateStackSequences(pushed []int, popped []int) bool {
    s := new(list.List)
    i := 0
    for _, num := range(pushed) {
        s.PushBack(num)
        for s.Len() > 0 && s.Back().Value.(int) == popped[i] {
            s.Remove(s.Back())
            i ++
        }
    }
    return s.Len() == 0
}

剑指 Offer 32 - I. 从上到下打印二叉树

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func levelOrder(root *TreeNode) []int {
    if root == nil { return []int{} }
    var res []int
    queue := list.New()
    queue.PushBack(root)
    for queue.Len() > 0 {
        node := queue.Front().Value.(*TreeNode)
        queue.Remove(queue.Front())
        res = append(res, node.Val)
        if node.Left != nil { queue.PushBack(node.Left) }
        if node.Right != nil { queue.PushBack(node.Right) }
    }
    return res
}

剑指 Offer 32 - II. 从上到下打印二叉树 II

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func levelOrder(root *TreeNode) [][]int {
    if root == nil { return [][]int{} }
    var res [][] int
    level := 0
    queue := list.New()
    queue.PushBack(root)
    for queue.Len() > 0{
        tmp := list.New()
        res = append(res, []int{})
        for queue.Len() > 0 {
            node := queue.Front().Value.(*TreeNode)
            queue.Remove(queue.Front())
            res[level] = append(res[level], node.Val)
            if node.Left != nil { tmp.PushBack(node.Left) }
            if node.Right != nil { tmp.PushBack(node.Right) }
        }
        queue = tmp
        level ++
    }
    return res
}

剑指 Offer 32 - III. 从上到下打印二叉树 III

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func levelOrder(root *TreeNode) [][]int {
    if root == nil { return [][]int{} }
    var res [][] int
    level := 0
    queue := list.New()
    queue.PushBack(root)
    for queue.Len() > 0{
        tmp := list.New()
        res = append(res, []int{})
        var tres []int 
        for queue.Len() > 0 {
            node := queue.Front().Value.(*TreeNode)
            queue.Remove(queue.Front())
            tres = append(tres, node.Val)
            if node.Left != nil { tmp.PushBack(node.Left) }
            if node.Right != nil { tmp.PushBack(node.Right) }
        }
        if level % 2 == 0 {
            res[level] = tres
        } else {
            for i := len(tres) - 1; i >= 0; i -- {
                res[level] = append(res[level], tres[i])
            }
        }
        queue = tmp
        level ++
    }
    return res
}

剑指 Offer 33. 二叉搜索树的后序遍历序列

func verifyPostorder(postorder []int) bool {
    return dfs(0, len(postorder) - 1, postorder)
}

func dfs(i, j int, postorder []int) bool {
    if i >= j { return true }
    p := i
    for postorder[p] < postorder[j] { p ++ }
    mid := p
    for postorder[p] > postorder[j] { p ++ }
    return p == j && dfs(i, mid - 1, postorder) && dfs(mid, j - 1, postorder)
}

剑指 Offer 34. 二叉树中和为某一值的路径

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func pathSum(root *TreeNode, sum int) [][]int {
    var res [][]int
    if root == nil { return res }
    dfs(root, sum, []int{}, &res)
    return res
}

func dfs(root *TreeNode, sum int, tmp []int, res* [][]int) {
    if root == nil { return }
    tmp = append(tmp, root.Val)
    if sum == root.Val && root.Left == nil && root.Right == nil {
        arr := make([]int,len(tmp))
        copy(arr, tmp)
        *res = append(*res, arr)
        return 
    }
    dfs(root.Left, sum - root.Val, tmp, res)
    dfs(root.Right, sum - root.Val, tmp, res)
}

剑指 Offer 35. 复杂链表的复制

/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Next *Node
 *     Random *Node
 * }
 */

func copyRandomList(head *Node) *Node {
    if head == nil { return nil }
    p := head
    for p != nil {
        node := &Node{p.Val, nil, nil}
        node.Next = p.Next
        p.Next = node
        p = node.Next
    }
    p = head
    for p != nil {
        if p.Random != nil { p.Next.Random = p.Random.Next }
        p = p.Next.Next
    }
    p = head
    res := p.Next
    for p.Next != nil {
        tmp := p.Next
        p.Next = tmp.Next
        p = tmp
    }
    return res
}

剑指 Offer 38. 字符串的排列

func permutation(s string) []string {
    var res []string
    dict := map[string]bool{}
    str := []byte(s)
    var dfs func(idx int)
    dfs = func(idx int) {
        if idx == len(str) {
            dict[string(str)] = true
            return 
        }
        for i := idx; i < len(str); i ++ {
            t := str[idx]
            str[idx] = str[i]
            str[i] = t
            dfs(idx + 1)
            str[i] = str[idx]
            str[idx] = t
        }
    }
    dfs(0)
    for key, _ := range(dict) {
        res = append(res, key)
    }
    return res
}

剑指 Offer 39. 数组中出现次数超过一半的数字

func majorityElement(nums []int) int {
    cnt, res := 0, -0x3f3f3f3f
    for _, val := range(nums) {
        if val != res {
            cnt --
            if(cnt <= 0) {
                cnt = 1
                res = val
            }
        } else {
            cnt ++
        }
    }
    return res
}

剑指 Offer 40. 最小的k个数

func getLeastNumbers(arr []int, k int) []int {
    return arr[:qsort(arr, 0, len(arr) - 1, k)]
}

func qsort(arr []int, l int, r int, k int) int {
    if l == r { return k }
    p, v := l, arr[l]
    for i := l + 1; i <= r; i ++ {
        if arr[i] < v {
            p ++
            arr[i], arr[p] = arr[p], arr[i]
        }
    }
    arr[l], arr[p] = arr[p], arr[l]
    if p == k { 
        return p
    } else if k < p {
        return qsort(arr, l, p - 1, k) 
    } else {
        return qsort(arr, p + 1, r, k)
    }
}

剑指 Offer 42. 连续子数组的最大和

func max(x, y int) int {
    if x > y { return x }
    return y
}

func maxSubArray(nums []int) int {
    res, tmp := nums[0], nums[0]
    for i := 1; i < len(nums); i ++ {
        if tmp >= 0 {
            tmp += nums[i]
        } else {
            tmp = nums[i];
        }
        res = max(res, tmp)
    }
    return res
}

剑指 Offer 44. 数字序列中某一位的数字

func findNthDigit(n int) int {
    digits, bits := 1, 9
    for n - bits * digits > 0 {
        n = n - bits * digits
        bits = bits * 10
        digits ++
    }
    num := 1
    for k := 1; k < digits; k ++ {
        num = num * 10
    }
    num = num + (n - 1) / digits
    idx := (n - 1) % digits
    strnum := strconv.Itoa(num)
    res, _ := strconv.Atoi(string(strnum[idx]))
    return res
}

剑指 Offer 45. 把数组排成最小的数

func minNumber(nums []int) string {
    sort.Slice(nums, func(i, j int)bool {
        return cmp(nums[i], nums[j])
    })

    var ret string
    for _, num := range nums {
		ret += strconv.Itoa(num)
	}
	return ret
}

func cmp(i, j int) bool {
    a := (strconv.Itoa(i) + strconv.Itoa(j))
    b := (strconv.Itoa(j) + strconv.Itoa(i))
    return a < b
}

剑指 Offer 46. 把数字翻译成字符串

func translateNum(num int) int {
    if(num < 10) { return 1 }
    res := 0
    if num % 100 < 26 && num % 100 > 9 {
        res = res + translateNum(num / 100)
        res = res + translateNum(num / 10)
    } else {
        res = res + translateNum(num / 10)
    }
    return res
}

剑指 Offer 47. 礼物的最大价值

func maxValue(grid [][]int) int {
    dp := make([][]int, len(grid) + 1)
    for i := 0; i <= len(grid); i ++ {
        dp[i] = make([]int, len(grid[0]) + 1)
    }
    max := func(x, y int) int {
        if x > y { return x}
        return y
    }
    for i := 1; i <= len(grid); i ++ {
        for j := 1; j <= len(grid[0]); j ++ {
            dp[i][j] = grid[i - 1][j - 1] + max(dp[i][j - 1], dp[i - 1][j])
        }
    }
    return dp[len(grid)][len(grid[0])]
}

剑指 Offer 48. 最长不含重复字符的子字符串

func lengthOfLongestSubstring(s string) int {
    if len(s) == 0 { return 0 }
    var vis [256]bool
    res, l, r := 1, 0, 1
    vis[s[l]] = true
    max := func(x, y int) int {
        if x > y { return x }
        return y
    }
    for r < len(s) {
        for vis[s[r] - 0] {
            vis[s[l] - 0] = false
            l ++
        } 
        vis[s[r] - 0] = true
        r ++
        res = max(r - l, res)
    }
    return res
}

剑指 Offer 49. 丑数

type MinHeap []int

func (h MinHeap) Len() int {
	return len(h)
}

func (h MinHeap) Less(i, j int) bool {
	return h[i] < h[j]
}

func (h *MinHeap) Swap(i, j int) {
	(*h)[i], (*h)[j] = (*h)[j], (*h)[i]
}

func (h *MinHeap) Push(x interface{}) {
	*h = append(*h, x.(int))
}

func (h *MinHeap) Pop() interface{}{
	res := (*h)[len(*h)-1]
	*h = (*h)[:len(*h)-1]
	return res
}

func nthUglyNumber(n int) int {
    h := make(MinHeap, 0)
    vis := make(map[int]bool)
    heap.Init(&h)
    heap.Push(&h, 1)
    for {
        t := heap.Pop(&h).(int)
        if vis[t] { continue }
        vis[t] = true
        n = n - 1
        if n == 0 { return t }
        heap.Push(&h, 2 * t)
        heap.Push(&h, 3 * t)
        heap.Push(&h, 5 * t)
    }
}

剑指 Offer 50. 第一个只出现一次的字符

func firstUniqChar(s string) byte {
    var vis [26]int
    for _, v := range(s) {
        vis[v - 'a'] ++
    }
    for _, v := range(s) {
        if vis[v - 'a'] == 1 {
            return byte(v)
        }
    }
    return ' '
}

剑指 Offer 51. 数组中的逆序对

func reversePairs(nums []int) int {
    if len(nums) == 0 { return 0 }    
    tmp := make([]int, len(nums))
    return mergesort(nums, tmp, 0, len(nums) - 1)
}

func mergesort(nums []int, tmp []int, l int, r int) int {
    if l == r { return 0 }
    mid := (l + r) / 2
    res := mergesort(nums, tmp, l, mid) + mergesort(nums, tmp, mid + 1, r)
    i, j, k := l, mid + 1, l;
    for i <= mid && j <= r {
        if nums[i] <= nums[j] {
            tmp[k] = nums[i]
            k ++
            i ++
        } else {
            tmp[k] = nums[j]
            k ++
            j ++
            res += mid - i + 1
        }
    }
    for i <= mid { 
        tmp[k] = nums[i] 
        k ++
        i ++
    }
    for j <= r { 
        tmp[k] = nums[j]
        k ++
        j ++
    }
    for i := l; i <= r; i ++ { nums[i] = tmp[i] }
    return res
}

剑指 Offer 52. 两个链表的第一个公共节点

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func getIntersectionNode(headA, headB *ListNode) *ListNode {
    p1, p2 := headA, headB
    for p1 != p2 {
        if p1 == nil {
            p1 = headB
        } else {
            p1 = p1.Next
        }
        if p2 == nil {
            p2 = headA
        } else {
            p2 = p2.Next
        }
    }
    return p1
}

剑指 Offer 53 - I. 在排序数组中查找数字 I

func search(nums []int, target int) int {
    if len(nums) == 0 { return 0 }
    bs1 := func () int {
        l, r := 0, len(nums) - 1
        for l < r {
            mid := (l + r) / 2
            if target <= nums[mid] {
                r = mid
            } else {
                l = mid + 1
            }
        }
        return l
    }
    bs2 := func () int {
        l, r := 0, len(nums)
        for l < r {
            mid := (l + r) / 2
            if target < nums[mid] {
                r = mid
            } else {
                l = mid + 1
            }
        }
        return l
    }
    s1, s2 := bs1(), bs2()
    if(nums[s1] == target) { return s2 - s1 }
    return 0
}

剑指 Offer 53 - II. 0~n-1中缺失的数字

func missingNumber(nums []int) int {
    l, r := 0, len(nums)
    for l < r {
        mid := (l + r) / 2
        if mid < nums[mid] {
            r = mid
        } else {
            l = mid + 1
        }
    }
    return l
}

剑指 Offer 54. 二叉搜索树的第k大节点

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func kthLargest(root *TreeNode, k int) int {
    var res []int
    dfs(&res, root)
    return res[k - 1]
}

func dfs(nums *[]int, r *TreeNode) []int{
    if r.Right != nil{
        dfs(nums, r.Right)
    }
    if r != nil{
        *nums = append(*nums, r.Val)
    }
    if r.Left != nil{
        dfs(nums, r.Left)
    }
    return *nums
}

剑指 Offer 55 - I. 二叉树的深度

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func max(x, y int) int {
    if x > y { return x }
    return y
}

func maxDepth(root *TreeNode) int {
    if root == nil { return 0 }
    return max(maxDepth(root.Left), maxDepth(root.Right)) + 1
}

剑指 Offer 55 - II. 平衡二叉树

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isBalanced(root *TreeNode) bool {
    ans := true
    treeDepth(root, &ans)
    return ans
}

func max(x, y int) int {
    if x > y { return x }
    return y
}

func abs(x, y int) int {
    if x - y < 0 { return y - x }
    return x - y
}

func treeDepth(root *TreeNode, ans *bool) int {
    if root == nil { return 0 }
    l := treeDepth(root.Left, ans)
    r := treeDepth(root.Right, ans)
    if abs(l, r) > 1 {
        *ans = false
    }
    return max(l, r) + 1
}

剑指 Offer 56 - I. 数组中数字出现的次数

func singleNumbers(nums []int) []int {
    div, res, a, b := 1, 0, 0, 0
    for _, i := range(nums) {
        res ^= i
    }
    for (div & res) == 0 { div <<= 1 }
    for _, i := range(nums) {
        if i & div > 0 {
            a ^= i
        } else {
            b ^= i
        }
    }
    return []int{a, b}
}

剑指 Offer 56 - II. 数组中数字出现的次数 II

func singleNumber(nums []int) int {
    ans := 0
    for i := 0; i < 32; i ++ {
        cnt := 0
        for _, v := range(nums) {
            if ((1 << i) & v) > 0 {
                cnt ++
            }
        }
        if cnt % 3 != 0 {
            ans += (1 << i)
        }
    }
    return ans
}

剑指 Offer 57. 和为s的两个数字

func twoSum(nums []int, target int) []int {
    l, r := 0, len(nums) - 1
    for l < r {
        sum := nums[l] + nums[r]
        if sum == target {
            return []int{nums[l], nums[r]}
        } else if sum > target {
            r --
        } else {
            l ++
        }
    }
    return []int{}
}

剑指 Offer 57 - II. 和为s的连续正数序列

func findContinuousSequence(target int) [][]int {
    var res [][]int
    l, r := 1, 1
    for l <= r && r < target {
        sum := (l + r) * (r - l + 1) / 2
        if sum == target {
            tmp := []int{}
            for i := l; i <= r; i ++ {
                tmp = append(tmp, i)
            }
            res = append(res, tmp)
            l ++
        } else if sum < target {
            r ++
        } else {
            l ++
        }
    }
    return res
}

剑指 Offer 58 - I. 翻转单词顺序

func reverseWords(s string) string {
    //Split函数是用来分割字符串的,这里是按照空格分割 即使两个空格相邻,也是一个空的字符串
	strList := strings.Split(s," ")
	var res []string
	for i := len(strList) - 1; i >= 0; i -- {
        //TrimSpace用来去掉字符串中的空白字符串
		str := strings.TrimSpace(strList[i])
		if  len(str) > 0 {
			res = append(res,strList[i])
		}
	}
    //Join函数是用来将一系列字符串连接成一个整的字符串,这里是按照空格来连接
	return strings.Join(res," ")
}

剑指 Offer 58 - II. 左旋转字符串

func reverseLeftWords(s string, n int) string {
    return s[n:] + s[:n]
}

剑指 Offer 59 - I. 滑动窗口的最大值

func maxSlidingWindow(nums []int, k int) []int {
    deque := list.New()
    var res []int
    for i := 0; i < len(nums); i ++ {
        if deque.Len() > 0 && i - deque.Front().Value.(int) >= k { 
            deque.Remove(deque.Front())
        }
        for deque.Len() > 0 && nums[deque.Back().Value.(int)] <= nums[i] {
            deque.Remove(deque.Back())
        }
        deque.PushBack(i)
        if i >= k - 1 {
            res = append(res, nums[deque.Front().Value.(int)])
        }
    }
    return res
}

剑指 Offer 62. 圆圈中最后剩下的数字

func dfs(n, m int) int {
    if n == 1 { return 0 }
    x := dfs(n - 1, m)
    return (m + x) % n
}

func lastRemaining(n int, m int) int {
    return dfs(n, m)
}

剑指 Offer 63. 股票的最大利润

func min(x, y int) int {
    if x < y { return x }
    return y
}

func max(x, y int) int {
    if x > y { return x }
    return y
}

func maxProfit(prices []int) int {
    pre, ans := 0x3f3f3f3f, 0
    for i := 0; i < len(prices); i ++ {
        pre = min(pre, prices[i])
        ans = max(ans, prices[i] - pre)
    }
    return ans
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值