利用左移右移求 nums 所有可能子集的和

在刷题 805. 数组的均值分割 的过程中 题解 看不懂

# 求nums所有可能子集的和,存储在ls列表中
nums = [1, 2, 3, 4]
ls = []
for i in range(1, 1 << 4):  # i范围:1~15,i不包括0,保证了子集不为空,
    s = 0
    # i==0时,0000,右移0、1、2、3分别为0000、0000、0000、0000
    
    # i==1时,0001,右移0、1、2、3分别为0001、0000、0000、0000
    # i==2时,0010,右移0、1、2、3分别为0010、0001、0000、0000
    # i==3时,0011,右移0、1、2、3分别为0011、0001、0000、0000
    # i==4时,0100,右移0、1、2、3分别为0100、0010、0001、0000
    # i==5时,0101,右移0、1、2、3分别为0101、0010、0001、0000
    # i==6时,0110,右移0、1、2、3分别为0110、0011、0001、0000
    # ……
    # i==15时,1111,右移0、1、2、3分别为1111、0111、0011、0001
    for j, v in enumerate(nums):
    	# 用来检查二进制数字i的第j位(从右往左)是否为1。如果为1,则表示选择了对应位置上的元素 
    	# 我的误区:1的二进制(如4位)是0001,而不是1111
        if i >> j & 1:  # i范围:1~4
            s += v      # j范围:0~3
    ls.append(s)
print(ls) 
# [1, 2, 3, 3, 4, 5, 6, 4, 5, 6, 7, 7, 8, 9, 10]
print(len(ls))
# 15

猜你喜欢

转载自blog.csdn.net/hu_wei123/article/details/132120951