华为OD机试-二进制差异数-2022Q4 A卷-Py/Java/JS

对于任意两个正整数A和B,定义它们之间的差异值和相似值:
差异值:A、B转换成二进制后,对于二进制的每一位,对应位置的bit值不相同则为1,否则为0;
相似值:A、B转换成二进制后,对于二进制的每一位,对应位置的bit值都为1则为1,否则为0;
现在有n个正整数A0到A(n-1),问有多少(i, j)0<=i<j<n),Ai和Aj的差异值大于相似值。
假设A=5,B=3;则A的二进制表示101;B的二进制表示011;
则A与B的差异值二进制为110;
相似值二进制为001;
A与B的差异值十进制等于6,相似值十进制等于1,满足条件。

输入描述

输入

一个n接下来n个正整数

数据范围:1<=n<=10^5,1<=A[i]<2^30

输出描述

输出

满足差异值大于相似值的对数

示例1 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

4
4 3 5 2

输出

4

说明

样例1解释

满足条件的分别是(0,1)(0,3)(1,2)(2,3),共4对。

Java 代码

import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;
import java.math.BigInteger;
 
public class Main {
    
	public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);
        int n = Integer.parseInt(in.nextLine());
        //转为数组
        List<Integer> nums =Arrays.stream(in.nextLine().split(" "))
                .map(Integer::parseInt)
                .collect(Collectors.toList());
 
        int[] bit_info = new int[100]; 
 
        for (int num : nums) {
          String num_binary = Integer.toBinaryString(num);
          int len = num_binary.length(); 
     
          if ("0".equals(num_binary)) {
            bit_info[0]++;
          } else {
            bit_info[num_binary.length()]++;
          }
        }
     
        int res = 0;
        for (int i = 0; i < bit_info.length; i++) {
          for (int j = i + 1; j < bit_info.length; j++) {
            res += bit_info[i] * bit_info[j];
          }
        }
 
 
 
        System.out.print(res);
        
    }
 
}

Python代码

import functools
import sys
 
# 处理输入
n = int(input())
nums = [int(x) for x in input().split(" ")]
 
res = 0
bit_info =[0 for x in range(100)] 
for num in nums:
    num_binary = bin(num).replace('0b','').lstrip('0');
    if (num_binary == ""):
        bit_info[0]+=1
    else:
        bit_info[len(num_binary)]+=1
 
 
result = 0
for i in range(len(bit_info)):
    for j in range(i+1, len(bit_info)):
        result += bit_info[i] * bit_info[j]
 
 
print(result)
 

JS代码

function main(nums) {
    let bit_info = new Array(100).fill(0); 
    for (let num of nums) {
        let num_binary = Number(num).toString(2);
        if (num_binary == "0") {
            bit_info[0]++;
        } else {
            bit_info[num_binary.length]++;
        }
    }
 
    bit_info = bit_info.filter(function(a) {
        return a != 0
    })
 
    let result = 0;
    for (let i = 0; i < bit_info.length; i++) {
        for (let j = i + 1; j < bit_info.length; j++) {
            result += bit_info[i] * bit_info[j];
        }
    }
    console.log(result);
 
}
 
main([4, 3 ,5 ,2])

猜你喜欢

转载自blog.csdn.net/miao_9/article/details/130042382