教学过程中,教练示范一次,学员跟做三次。该过程被混乱剪辑后,记录于数组 actions,其中 actions[i] 表示做出该动作的人员编号。请返回教练的编号。
示例 1:
输入:actions = [5, 7, 5, 5]
输出:7
示例 2:
输入:actions = [12, 1, 6, 12, 6, 12, 6]
输出:1
public int trainingPlan(int[] nums) {
int[] res = new int[32];
// 统计每一位上的 1 共有几个
for(int num : nums){
for(int i=0;i<32;i++){
res[i] += num & 1;
num>>=1;
}
}
// 统计完了就得想办法把这个数组还原成二进制数
int ans = 0,m = 3;
for(int i=0;i<32;i++){
// 从头开始遍历,对 3 取余后的数字,每一位对应的位置应该是 x << i
// 比如 res 取余 3 后为 1001,ans 的变化过程为
// 0000 | 1<<0 = 0001
// 0001 | 0<<1 = 0001
// 0001 | 0<<2 = 0001
// 0001 | 1<<3 = 1001
// 所以 <
ans |= res[i]%3<<i;
}
return ans;
}
# 其实这也已经简化过了,没有划分每种 two, n, one 最终计算出的对应的 新one
if two==0:
if n==0: #记得这个 n 表示的是在 32 位的某一位上的数,因为 one two 也是用来表示某一位相加过程中的状态
# 你也可以自己划分一下 if one== 0,if one == 1,会发现最后结果都是 one
one = one
if n==1:
one = ~one # one 的相反数
if two==1:
# 此时 two one 只可能为 10,那么你 n 为 0 ,one 还是保持为 0,n 为 1,我就得变成 00,one 还是 0
# 也就是说 n 首先此时必定为 0,并且无论变或不变最后都成了 0
one = 0
n one newone
0 0 0
0 1 1
1 0 1
1 1 0
if two==0:
one = one^n
if two==1:
one = 0
two one newone
0 one one
0 one one
1 one 0
1 one 0
x?0=x, x?1=0
,我们知道 x&1=x, x&0=0
,但是这里正好相反,是 0 和 1,因为 ~0=1,~1=0
,那么不难想到了, x&~0=x, x&~1=0
,所以我们就得到了 newone = one &~two,把 one^n 再代入回来,我们最终得到了one = (one^n) & ~two
if two==0:
if n==0:
if one == 0:
two = two
elif one == 1:
two = two
if n==1:
if one == 0:
two = 1 #~two
if one == 1:
two = two
elif two==1:
if n==0:
if one == 0:
two = two
if n==1:
if one == 0:
two = 0 #~two
if two==0:
if n==1:
if one == 0:
two = 1
elif two==1:
if n==1:
two = 0
if two==0:
if n==1 && one == 0:
two = 1
elif two==1:
if n==1 && one == 0:
two = 0
if two==0:
if n&~one:
two = 1
elif two==1:
if n&~one:
two = 0
if two==0:
if n&~one:
two = 1 # 这个 two 就是 newtwo
else:
two = 0
elif two==1:
if n&~one:
two = 0
else:
two = 1
two n&~one newtwo
0 0 0
0 1 1
1 0 1
1 1 0
public int trainingPlan(int[] nums) {
// 因为是批量位运算,所以用了 ones 而不是 one
int twos = 0, ones = 0;
for(int n:nums){
ones = (ones^n) & ~twos;
twos = twos ^ n & ~ones;
}
return ones;
}
public int trainingPlan(int[] nums) {
int twos = 0, ones = 0;
for(int n:nums){
ones = ones^n & ~twos;
twos = twos ^ n & ~ones;
}
return ones;
}