LeetCode周赛283(Golang)

比赛链接:力扣周赛283

6016. Excel 表中某个范围内的单元格

题意:

        给定一个字符串,用来表示excel单元格的范围,要求按顺序返回范围内的所有excel单元格编号。

思路:

        直接模拟,二重循环生成答案加入到数组当中。

代码(Golang):

func cellsInRange(s string) []string {
    ans:=make([]string,0)
    for i:=s[0];i<=s[3];i++{
        for j:=s[1];j<=s[4];j++{
            tmp:=string(i)+string(j)
            ans=append(ans,tmp)
        }
    }
    return ans
}

6017. 向数组中追加 K 个整数

题意:

        向数组当中追加k个正整数,要求:

  • 每个追加的正整数都没有在数组中出现过,且互不相同
  • 追加的k个正整数之和最小

思路:

  • 先计算出最小的k个正整数的和,记为ans
  • 然后判断每个数组中的正整数是否小于k,如果小于k就要从ans中减去当前正整数,并且加入一个k+1,并使k=k+1,表示当前所取到的k个数的最大值
  • 坑点:给定的数组有可能出现重复值,所以要加一个pre去重避免重复判断

代码(Golang):

func minimalKSum(nums []int, k int) int64 {
    ans:=int64(k*(k+1)/2)
    pre:=-1
    sort.Ints(nums)
    for i:=range nums{
        if nums[i]<=k && pre!=nums[i]{
            k++
            ans+=int64(k)
            ans-=int64(nums[i])
            pre=nums[i]
        }
    }
    //fmt.Println(nums)
    return ans
}

6018. 根据描述创建二叉树

题意:

        给定一个二维数组,用来描述二叉树的节点关系。

        对于一个元组,有三个值:[pi,ci,li],表示节点 pi 是节点 ci 的父节点,若 li==0 ,则 ci 右子节点,若 li==1,则 ci左子节点

        要求根据描述构建一个二叉树,并返回根节点。

思路:

  1. 用一个map保存节点值与节点指针的映射。
  2. 如果当前节点在map中存在,就取出来使用,如果不存在,就新建节点并存入map中。
  3. 需要用一个indegree map来维护节点的入度,如果节点的入度为0,则表示该节点为根节点。

代码(Golang):

func createBinaryTree(d [][]int) *TreeNode {
    mp,id:=make(map[int]*TreeNode),make(map[int]int)
    
    for i:=range d{
        p:=d[i][0]
        c:=d[i][1]
        l:=d[i][2]
        id[c]++
        var now,child *TreeNode
        if res,ok:=mp[p];ok{
            now=res
        }else{
            now=&TreeNode{p,nil,nil}
            mp[p]=now
        }
        if res,ok:=mp[c];ok{
                child=res
        }else{
            child=&TreeNode{c,nil,nil}
            mp[c]=child
        }
        if l==0{
            now.Right=child
        }else{
            now.Left=child
        }
    }
    for i:=range d{
        if id[d[i][0]]==0{
            return mp[d[i][0]]
        }
    }
    return nil
}

6019. 替换数组中的非互质数

题意:

        给定一个数组,每次取任意两个相邻的非互质数 i,j ,将它们合并成lcm(i,j),反复该操作直到数组当中没有相邻的非互质数。

比赛时候的思路:

  • 模拟:从第一个数开始,对相邻的非互质数进行合并。
  • 然后会发现存在一些不能完全合并的现象。
  • 所以就反复合并几趟。

榜一大佬的思路:

  • 相当于用一个栈保存结果(代码中用数组实现栈可直接返回结果)。
  • 对于每一个nums[i],如果与栈顶元素为非互质数,就出栈,更新结果,直到与栈顶是互质数,再压入栈中。

代码(Golang):

func replaceNonCoprimes(nums []int) []int {
    ans:=make([]int,0)
    for i:=range nums{
        x:=nums[i]
        for len(ans)>0 && gcd(x,ans[len(ans)-1])>1{
            x=lcm(x,ans[len(ans)-1])
            ans=ans[:len(ans)-1]
        }
        ans=append(ans,x)
    }
    return ans
}

func gcd(i,j int)int{
    if j==0{
        return i
    }
    return gcd(j,i%j)
}

func lcm(i,j int)int{
    return i/gcd(i,j)*j
}

后记:

        虽然这是人生中第一回ak力扣,但是说实话这把题目并不难,罚时也有些丑陋。再者,第四题应该有更好的方法可以解决,所使用的方法多少有些投机取巧了,后续还要好好学习,争取把把ak。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值