从零开始的力扣刷题记录-第五十一天

力扣每日四题

  • 897. 递增顺序搜索树-简单
  • LCP 17. 速算机器人-简单
  • LCS 01. 下载插件-简单
  • 105. 从前序与中序遍历序列构造二叉树-中等
  • 总结

897. 递增顺序搜索树-简单

题目描述:
给你一棵二叉搜索树的 root ,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。

题解:
中序遍历存储节点后按顺序连接即可

代码(Go):

func increasingBST(root *TreeNode) *TreeNode {
    sce := []int{}
    var front func(*TreeNode)
    front = func(node *TreeNode) {
        if node != nil {
            front(node.Left)
            sce = append(sce, node.Val)
            front(node.Right)
        }
    }
    front(root)
    reNode := &TreeNode{}
    p := reNode
    for _, val := range sce {
        p.Right = &TreeNode{Val: val}
        p = p.Right
    }
    return reNode.Right
}

LCP 17. 速算机器人-简单

题目描述:
小扣在秋日市集发现了一款速算机器人。店家对机器人说出两个数字(记作 x 和 y),请小扣说出计算指令:
“A” 运算:使 x = 2 * x + y;
“B” 运算:使 y = 2 * y + x。
在本次游戏中,店家说出的数字为 x = 1 和 y = 0,小扣说出的计算指令记作仅由大写字母 A、B 组成的字符串 s,字符串中字符的顺序表示计算顺序,请返回最终 x 与 y 的和为多少。

题解:
直接模拟

代码(Go):

func calculate(s string) int {
    x := 1
    y := 0
    for _,v := range s{
        if v == rune('A'){
            x = 2 * x + y
        }else{
            y = 2 * y + x
        }
    }
    return x + y
}

LCS 01. 下载插件-简单

题目描述:
小扣打算给自己的 VS code 安装使用插件,初始状态下带宽每分钟可以完成 1 个插件的下载。假定每分钟选择以下两种策略之一:
使用当前带宽下载插件
将带宽加倍(下载插件数量随之加倍)
请返回小扣完成下载 n 个插件最少需要多少分钟。
注意:实际的下载的插件数量可以超过 n 个

题解:
这个题比较容易想到,加速一定是最优的,最差的情况加速也只是和不加速用时相等,所以只需要一直加速直到可以一次下载完返回sum+1即可

代码(Go):

func leastMinutes(n int) int {
    num := 1
    sum := 0
    for num < n{
        num = num * 2
        sum++
    }
    return sum + 1
}

105. 从前序与中序遍历序列构造二叉树-中等

题目描述:
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

题解:
递归,在中序数组中找到根节点后将数组分为两部分,并以此为根据再把前序数组划分为两部分,分别调用递归函数

代码(Go):

func buildTree(preorder []int, inorder []int) *TreeNode {
    if len(preorder) == 0 {
        return nil
    }
    root := &TreeNode{preorder[0], nil, nil}
    i := 0
    for i < len(inorder){
        if inorder[i] == preorder[0] {
            break
        }
        i++
    }
    root.Left = buildTree(preorder[1:len(inorder[:i])+1], inorder[:i])
    root.Right = buildTree(preorder[len(inorder[:i])+1:], inorder[i+1:])
    return root
}

总结

今天尝试了一下困难难度的每日一题,只能说还是有点自不量力了,时间浪费有点多,所以挑了道比较容易的中等题

你可能感兴趣的:(leetcode刷题,leetcode,算法,golang)