• 力扣刷题 day56:10-26


    1.解码异或后的数组

    未知 整数数组 arr 由 n 个非负整数组成。

    经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。

    给你编码后的数组 encoded 和原数组 arr 的第一个元素 first(arr[0])。

    请解码返回原数组 arr 。可以证明答案存在并且是唯一的。

    方法一:异或运算 

    1. #方法一:异或运算
    2. def decode(encoded,first):
    3. res=[0 for i in range(len(encoded)+1)]
    4. res[0]=first
    5. for i in range(1,len(encoded)+1):
    6. res[i]=res[i-1]^encoded[i-1] #利用性质 encoded[i-1]=res[i]^res[i-1]
    7. # encoded[i-1]^res[i-1]=res[i]
    8. return res

    2.找出所有子集的异或总和再求和 

    一个数组的 异或总和 定义为数组中所有元素按位 XOR 的结果;如果数组为 空 ,则异或总和为 0 。

    例如,数组 [2,5,6] 的 异或总和 为 2 XOR 5 XOR 6 = 1 。
    给你一个数组 nums ,请你求出 nums 中每个 子集 的 异或总和 ,计算并返回这些值相加之 和 。

    注意:在本题中,元素 相同 的不同子集应 多次 计数。

    数组 a 是数组 b 的一个 子集 的前提条件是:从 b 删除几个(也可能不删除)元素能够得到 a 。

    方法一:二进制枚举 

    1. #方法一:二进制枚举
    2. def subsetXORSum(nums):
    3. res=0
    4. for i in range(0,1<<len(nums)):
    5. tem=0
    6. for j in range(0,len(nums)): #子集100表示取出第三个数 1100以此类推
    7. if(i&(1<
    8. tem^=nums[j] #二进制枚举,看这一位是不是1,是1就代表是子集元素
    9. res+=tem
    10. return res

  • 相关阅读:
    【老生谈算法】matlab绘制温度场原理——温度场原理
    第二章 USB应用笔记之USB通讯基础
    企业视频数字人有哪些应用场景
    【写作神器】Markdown编辑器实用语法
    leetcode 746. 使用最小花费爬楼梯
    计算机毕业设计之java+ssm的校园旧书交易交换平台
    红米K40解BL锁以及刷国外EU版系统
    20240424 diary
    面试题——网络IO模型
    Jenkins指南-安装部署
  • 原文地址:https://blog.csdn.net/hhhh1ay/article/details/134066654