leetcode udpate

This commit is contained in:
gameloader 2024-05-30 15:52:24 +08:00
parent 0a4a8c3738
commit 9690039188

View File

@ -6603,3 +6603,47 @@ func numSteps(s string) int {
### 总结
本题直接从最后一位开始向前遍历, 遇到0直接将结果加1, 遇到1设定一个标记进位的标记变量为1, 同时将结果加2, 如此重复即可. 注意在每次判断当前位是0还是1之前要将原本的当前位值加上进位的标记变量再判断.
## day94 2024-05-30
### 1442. Count Triplets That Can Form Two Arrays of Equal XOR
Given an array of integers arr.
We want to select three indices i, j and k where (0 <= i < j <= k < arr.length).
Let's define a and b as follows:
a = arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]
b = arr[j] ^ arr[j + 1] ^ ... ^ arr[k]
Note that ^ denotes the bitwise-xor operation.
Return the number of triplets (i, j and k) Where a == b.
![0530uVcNw3JX4b49](https://testingcf.jsdelivr.net/gh/game-loader/picbase@master/uPic/0530uVcNw3JX4b49.png)
### 题解
题目中要求i-j和j-k之间的数组元素全部异或后的值相等, 而i<j<=k. 两个相同的值异或后的值为0, 因此可以得出结论, i-k之间的数异或后的值为0(i-j,j-k范围内的数异或后的值相同). i-k区间内的数异或后的值为0, 就意味着从头开始到i和从头开始到k这两个区间的数异或的值相等(不一定为0). 遍历数组, 计算到当前下标处的异或值. 并将异或值作为key, 下标作为value保存到map中, 计算得到异或值后查询map, 找到与当前下标异或值相等的全部下标, 并将这些区间内的所有可行分割(长度为n的区间有n-1种分割方法, 直观理解放木板到这个区间的数字之间, 一共能放几块就是几种分割方法)数目添加到结果中.
### 代码
```go
func countTriplets(arr []int) int {
xormap := map[int][]int{}
xormap[0] = []int{-1}
xornow := 0
result := 0
beforeslice := []int{}
for index, value := range arr{
xornow = xornow ^ value
beforeslice = xormap[xornow]
if len(beforeslice) == 0{
xormap[xornow] = []int{index}
}else{
for _, sameindex := range beforeslice{
result += index - sameindex - 1
}
xormap[xornow] = append(xormap[xornow], index)
}
}
return result
}
```