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 为左子节点。
要求根据描述构建一个二叉树,并返回根节点。
思路:
- 用一个map保存节点值与节点指针的映射。
- 如果当前节点在map中存在,就取出来使用,如果不存在,就新建节点并存入map中。
- 需要用一个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。