区间合并,区间交集,区间并集等等,数组中一个重复一次,两次相关问题
区间相关
- golang 使用Slice便捷排序
func main() {
arr:=[][]int{{1,2},{1,3},{1,4},{1,5},{1,6}}
//排序
//第一个参数不是slice则panic
sort.Slice(arr,func (i,j int)bool{ //按照第二个元素倒序排列
x:=arr[i]
y:=arr[j]
return x[1]>y[1]
})
fmt.Println(arr)
}
56 合并区间
字节 tencent
986 区间列表交集
数组中数的处理
442 数组中重复的数据
- 原地hash
根据数值找指定索引。如果当前索引的值>0则变负。如果<0则证明出现过
func findDuplicates(nums []int) []int {
//原地hash
res:=make([]int,0)
for i:=0;i<len(nums);i++{
index:=abs(nums[i])-1 //索引值,防止溢出
if nums[index]>0{
nums[index] = -nums[index]
}else{
res = append(res,index+1)
}
}
return res
}
func abs(x int)int{ //自带math.Abs只能处理float64
if x<0{
return -x
}
return x
}
278 寻找重复数
- 原地hash 类似442
func findDuplicate(nums []int) int {
//原地hash
for i:=0;i<len(nums);i++{
index:=abs(nums[i])-1 //索引值,防止溢出
if nums[index]>0{
nums[index] = -nums[index]
}else{
return index+1
}
}
return 0
}
func abs(x int)int{ //自带math.Abs只能处理float64
if x<0{
return -x
}
return x
}
模拟加减乘除类
415 字符串相加t
43 字符串相乘t
- 特殊方式,找规律,主要是m位n位结果最大m+n位
然后,ij在i+j和i+j+1位置,i+j靠近前面,所以更大,代表进位,最终结果最多开头一位是0
func multiply(num1 string, num2 string) string {
if num1=="0"||num2=="0"{
return "0"
}
arr:=make([]int,len(num1)+len(num2)) //最多m+n位
for i:=len(num1)-1;i>=0;i--{
m:=int(num1[i]-'0')
for j:=len(num2)-1;j>=0;j--{
n:=int(num2[j]-'0')
tmp:=arr[i+j+1]+m*n
arr[i+j+1] = tmp%10//数据已经加过,计算本位的值
arr[i+j] += tmp/10 //更小则权重更大,因此加上进位
}
}
//取出字符串
res:=""
for i,v:=range arr{
if i==0&&v==0{
continue
}
res+=string(v+'0')
}
return res
}