当前位置:   article > 正文

LeetCode-1486. 数组异或操作【位运算 数学】

LeetCode-1486. 数组异或操作【位运算 数学】

题目描述:

给你两个整数,n 和 start 。

数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == nums.length 。

请返回 nums 中所有元素按位异或(XOR)后得到的结果。

示例 1:

输入:n = 5, start = 0
输出:8
解释:数组 nums 为 [0, 2, 4, 6, 8],其中 (0 ^ 2 ^ 4 ^ 6 ^ 8) = 8 。
“^” 为按位异或 XOR 运算符。
示例 2:

输入:n = 4, start = 3
输出:8
解释:数组 nums 为 [3, 5, 7, 9],其中 (3 ^ 5 ^ 7 ^ 9) = 8.
示例 3:

输入:n = 1, start = 7
输出:7
示例 4:

输入:n = 10, start = 5
输出:2

提示:

1 <= n <= 1000
0 <= start <= 1000
n == nums.length

解题思路一:暴力很简单。

class Solution:
    def xorOperation(self, n: int, start: int) -> int:
        ans = start
        for i in range(1, n):
            # ans ^= start + 2 * i
            ans = ans ^ (start + 2 * i)
        return ans
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

时间复杂度:O(n)
空间复杂度:O(1)

解题思路二:优化!时间复杂度:O(1)。注释丰富,明了。

首先要知道:
在这里插入图片描述
解释一下性质五: 0^1^2^3 = 0, 4^5^6^7=0, 8^9^10^11=0 .....以此下去, 有这么个规律存在. 为什么呢? 可以用结合律,把前边两个数和后边两个数分开运算。 然后把数字转换成二进制,4的倍数的部分和最后两位没有关系,4个数字都是相同的, 就比如> 四个数字依次是xxxx00,xxxx01,xxxx10,xxxx11 然后取异或 前两个数的结果就是01,后两个数的异或结果还是01, 01和01异或,结果当然就是0啦
在这里插入图片描述
观察公式可以知道,这些数的奇偶性质相同,因此它们的二进制表示中的最低位或者均为 1,或者均为 0。于是我们可以把参与运算的数的二进制位的最低位提取出来单独处理。当且仅当 start 为奇数,且 n 也为奇数时,结果的二进制位的最低位才为 1。
e = n & start & 1 # 取最低位
在这里插入图片描述
为啥 sumXor() 的逻辑是这样的:
在这里插入图片描述
看代码注释也可以 !

class Solution:
    def xorOperation(self, n: int, start: int) -> int:
        # 计算目标 start ^ (start + 2) ^ (start + 4) ^ ... ^ (start + 2(n-1))

        # 1.提取一个2出来,并且令s = start//2,得到:
        #           (s ^ (s+1) ^ (s+2) ^ ... ^ (s+n-1)) x 2 + e
        # 2.这里的e是计算目标的最低位,依据计算目标的特点,e取决于start和n。当且仅当 start 为奇数,且 n 也为奇数时,结果的二进制位的最低位才为 1。
        #           e = n & start & 1
        # 3.我们只需要计算:cur = (s ^ (s+1) ^ (s+2) ^ ... ^ (s+n-1))
        #           依据性质4和性质3:x ^ y ^ y = x 和 (x ^ y) ^ z = x ^ (y + z)
        #           只需计算:(0 ^ 1 ^ 2 ^ 3 ^ ... ^ s - 1)^( 0 ^ 1 ^ 2 ^ 3 ^ …… ^ s - 1 ^ s ^ (s+1) ^ (s+2) ^ ... ^ (s+n-1))
        #           便可以得到 (s ^ (s+1) ^ (s+2) ^ ... ^ (s+n-1))
        # 4. (0 ^ 1 ^ 2 ^ 3 ^ ... ^ s - 1) 的计算函数sumXor(x)的逻辑:
        #           见函数定义注释以及图解
        # 5. 最终答案为cur << 1 | e
        #           等价于(s ^ (s+1) ^ (s+2) ^ ... ^ (s+n-1)) x 2 + e
        def sumXor(x):
            if x % 4 == 0: # 刚好剩下n
                return x
            if x % 4 == 1: # n ^ (n+1) = 1
                return 1
            if x % 4 == 2: # n ^ (n+1) ^ (n+2) = 1 ^ (n+2) !!!注意此时x为(n+2)
                return x + 1
            if x % 4 == 3: #  n ^ (n+1) ^ (n+2) ^ (n+3) = 0 全部消掉
                return 0
        e = n & start & 1 # 取最低位
        s = start >> 1
        cur = sumXor(s-1) ^ sumXor(s+n-1)
        return cur << 1 | e
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

时间复杂度:O(1)
空间复杂度:O(1)

解题思路三:精简版!

class Solution:
    def xorOperation(self, n: int, start: int) -> int:
        def sumXor(x):
            if x % 4 == 0:
                return x
            if x % 4 == 1:
                return 1
            if x % 4 == 2:
                return x + 1
            if x % 4 == 3:
                return 0
        e = start & n & 1
        s = start // 2
        ans = sumXor(s-1) ^ sumXor(s+n-1)
        return ans * 2 + e
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

时间复杂度:O(n)
空间复杂度:O(n)


创作不易,观众老爷们请留步… 动起可爱的小手,点个赞再走呗 (๑◕ܫ←๑)
欢迎大家关注笔者,你的关注是我持续更博的最大动力


原创文章,转载告知,盗版必究



在这里插入图片描述


在这里插入图片描述
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/582104
推荐阅读
相关标签
  

闽ICP备14008679号