// 将所有数所占的二进制位算出来 for(int i = 0; i < n; i++) { int temp = nums[i]; int tick = 0; while(temp != 0) { rank[tick] += temp & 1; temp >>= 1; tick++; } }
int sum = 0;
// 求出总的二进制占位数 for (int i = 0; i < rank.length; i++) { sum += rank[i]; }
// 每次累加 (sum 减去 与当前数所占位相同的数) // 比如3 // 0101 // 此时就要减去3有的位次数, // 只取其他类似于第二位,第四位等其他存在1的位次数 for (int i = 0; i < n; i++) { int temp = nums[i]; int tick = sum; int times = 0;