数组区间操作,数组中重复数相关

区间合并,区间交集,区间并集等等,数组中一个重复一次,两次相关问题

区间相关

  • 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位
    然后,i
    j在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
}
posted @ 2021-09-08 23:46  海拉尔  阅读(41)  评论(0编辑  收藏  举报