题目解析
* 输入输出:第一行输入整数 nnn 表示数据量,第二行输入 nnn 个非负整数。输出两个整数:所有数字二进制表示中 111 的总个数,以及校验码(111 的个数为奇数输出 111,否则输出 000)。
* 数据范围:1≤n≤1001 \le n \le 1001≤n≤100,0≤ci≤2550 \le c_i \le 2550≤ci ≤255(即每个数可用 888 位二进制表示)。
* 复杂度要求:由于每个数最多 888 位二进制,时间复杂度 O(n⋅log(max(ci)))≈O(n)O(n \cdot \log(\max(c_i))) \approx O(n)O(n⋅log(max(ci )))≈O(n),即 O(100)O(100)O(100) 级别;空间复杂度 O(1)O(1)O(1)。
* 算法知识点:二进制位运算、奇偶校验、逐位统计
思路解析
1. 统计所有数字的1的个数:遍历每个输入数字,对每个数字通过不断除以 222(右移)的方式,逐位检查其二进制表示中 111 的个数。
2. 逐位检查原理:对于任意整数 xxx,x mod 2x \bmod 2xmod2 的结果即为 xxx 二进制表示的最低位(000 或 111)。若为 111 则计数器加一,随后将 xxx 除以 222(整数除法等价于右移一位),继续检查下一位,直到 xxx 变为 000。
3. 计算校验码:累计得到所有数字中 111 的总数 one_cnt\textit{one\_cnt}one_cnt 后,校验码即为 one_cnt mod 2\textit{one\_cnt} \bmod 2one_cntmod2(奇数为 111,偶数为 000)。
4. 输出结果:按格式要求依次输出 111 的总数和校验码。
完整代码