前言
昨天又偷懒没写题,状态怎么老是不好,找原因啊!
内容
一、前k个高频元素
给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
基于排序
用哈希表获取每个数字出现的次数
func topKFrequent(nums []int, k int) []int {
ans:=[]int{}
map_num:=map[int]int{}
for _,item:=range nums{
map_num[item]++
}
for key,_:=range map_num{
ans=append(ans,key)
}
sort.Slice(ans,func(a,b int)bool{
return map_num[ans[a]]>map_num[ans[b]]
})
return ans[:k]
}
堆
堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。 如果父亲结点是大于等于左右孩子就是大顶堆,小于等于左右孩子就是小顶堆。
这里用小顶堆,要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素
func topKFrequent(nums []int,k int)[]int{
map_num:=map[int]int{}
for _,item:=range nums{记录每个元素出现的次数
map_num[item]++
}
h:=&IHeap{}
heap.Init(h)
for key,value:=range map_num{
heap.Push(h,[2]int{key,value})
if h.Len()>k{
heap.Pop(h)
}
}
res:=make([]int,k)
for i:=0;i<k;i++{
res[k-i-1]=heap.Pop(h).([2]int)[0]
//数组的索引从 0 开始,因此 k-i-1 表示的是数组的倒数第 i 个元素位置。
}
return res
}
type IHeap [][2]int//定义了一个名为IHeap的二维整数数组类型,每个元素是一个包含两个整数的数组
func (h IHeap)Len()int{
return len(h)
}
func (h IHeap)Less(i,j int)bool{
return h[i][1]<h[j][1]//比较是基于第二个元素进行的(即h[i][1]和h[j][1]),并且如果第一个元素的第二个值小于第二个元素的第二个值,则返回true。
}
func (h IHeap)Swap(i,j int){
h[i],h[j]=h[j],h[i]
}
func (h *IHeap) Push(x interface{}){
*h=append(*h,x.([2]int))//为了将x添加到堆中,代码将其转换为[2]int类型
}
func(h *IHeap)Pop() interface{}{
old:=*h
n:=len(old)
x:=old[n-1]
*h=old[0:n-1]
return x
}
二、简化路径
给你一个字符串 path
,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/'
开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.
)表示当前目录本身;此外,两个点 (..
) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//'
)都被视为单个斜杠 '/'
。 对于此问题,任何其他格式的点(例如,'...'
)均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
- 始终以斜杠
'/'
开头。 - 两个目录名之间必须只有一个斜杠
'/'
。 - 最后一个目录名(如果存在)不能 以
'/'
结尾。 - 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含
'.'
或'..'
)。
返回简化后得到的 规范路径 。
栈
今天才知道切片是左闭右开区间。。。对自己非常无语
func simplifyPath(path string) string {
stack:=[]string{}
for _,name:=range strings.Split(path,"/"){
if name==".."{
if len(stack)>0{
stack=stack[:len(stack)-1]
}
//切片 左闭右开
} else if name!=""&&name!="."{
stack=append(stack,name)
}
}
return "/"+strings.Join(stack,"/")
}
最后
就到这吧,写个总结。