持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
🎈算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道中等难度的题目 -> 在LR字符串中交换相邻字符
题目描述
给你两个下标从 0 开始的数组 nums1 和 nums2 ,两个数组都只包含非负整数。请你求出另外一个数组 nums3 ,包含 nums1 和 nums2 中 所有数对 的异或和(nums1 中每个整数都跟 nums2 中每个整数 恰好 匹配一次)。
请你返回 nums3 中所有整数的 异或和 。
示例 1:
输入:nums1 = [2,1,3], nums2 = [10,2,5,0]
输出:13
解释:
一个可能的 nums3 数组是 [8,0,7,2,11,3,4,1,9,1,6,3] 。
所有这些数字的异或和是 13 ,所以我们返回 13 。
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:0
解释:
所有数对异或和的结果分别为 nums1[0] ^ nums2[0] ,nums1[0] ^ nums2[1] ,nums1[1] ^ nums2[0] 和 nums1[1] ^ nums2[1] 。
所以,一个可能的 nums3 数组是 [2,5,1,6] 。
2 ^ 5 ^ 1 ^ 6 = 0 ,所以我们返回 0 。
提示:
- 1 <= nums1.length, nums2.length <= 10^5
- 0 <= nums1[i], nums2[j] <= 10^9
思路分析
题意理解
首先我们应该先理解一下题目的意思,我们需要通过给出的两个数组 nums1 和 nums2 得到第三个数组nums3,nums3包含 nums1 和 nums2 中 所有数对 的异或和(nums1 中每个整数都跟 nums2 中每个整数 恰好 匹配一次),我们需要计算nums3中所有整数的 异或和。
如例2:nums1 = [1,2], nums2 = [3,4],我们可以得到nums[3],[nums1[0] ^ nums2[0],nums1[0] ^ nums2[1],nums1[1] ^ nums2[0],nums1[1] ^ nums2[1]],即:nums[3] = [2,5,1,6]。
nums3所有整数的异或和为2 ^ 5 ^ 1 ^ 6 = 0,所以0即为我们得到的结果。
什么是异或和
知道了题目的要求之后,我们接下来还需要了解一下什么是异或和。
异或(exclusive OR,缩写成xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:a⊕b = (¬a ∧ b) ∨ (a ∧¬b);如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。异或也叫半加运算,其运算法则相当于不带进位的二进制加法。
其中有几条重要的运算法则:
-
- a ⊕ a = 0
-
- a ⊕ b = b ⊕ a
-
- a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;
-
- d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
-
- a ⊕ b ⊕ a = b.
解题思路
理解了题意并且知道了异或和的相关计算公式之后,我们并可以开始来进行解题分析,回过头,我们再来分析一下题目。
设
nums1=[a,b],nums2=[c,d];
由题意可得nums[3] =[a^c,a^d,b^c,b^d]
nums[3]的异或和x为:(a^c)^(a^d)^(b^c)^(b^d)
通过结合律,我们可以得:
x = a^c^a^d^b^c^b^d
通过交换律,我们可以得:
x = a^a^b^b^c^c^d^d
因为a ⊕ a = 0,所以我们可以得到:
x = 0
通过上面的分析,我们可以知道,答案与x中整数出现重复的次数有关,出现次数为偶数的整数进行异或和为零,即次数为偶数的整数会抵消掉。那么整数中重复的次数要怎么计算呢?nums1 中每个整数都跟 nums2 中每个整数 恰好 匹配一次,从这句话中我们可以知道,nums1中的每个整数出现的次数与nums2的长度有关;nums2中的每个整数出现的次数与nums1的长度有关。nums1的长度为奇数时,nums2中每个整数出现的整数也为奇数,这是我们需要计算nums2所有整数的异或和;nums2的长度为奇数时,nums1中每个整数出现的整数也为奇数,这是我们需要计算nums1所有整数的异或和;
具体代码如下:
AC代码
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
var xorAllNums = function(nums1, nums2) {
let res = 0;
if(nums2.length % 2 == 1) {
for(let i = 0; i < nums1.length; i++){
res ^= nums1[i];
}
}
if(nums1.length % 2 == 1) {
for(let i = 0; i < nums2.length; i++){
res ^= nums2[i];
}
}
return res;
};
说在后面
🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。