比赛链接:力扣周赛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。