> 文档中心 > LeetCode周赛283(Golang)

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。