统计差异值大于相似值二元组个数
知识点数组 进制转换Q 整数范围循环
时间限制: 1s 空间限制: 256MB 限定语言: 不限
题目描述:
题目描述: 对于任意两个正整数A和B,定义它们之间的差异值和相似值:
差异值: A、B转换成二进制后,对于二进制的每一位,对应位置的bit值不相同则为1,否则为0;
相似值: A、B转换成二进制后,对于二进制的每一位,对应位置的bit值都为1则为1,否则为0;
现在有n个正整数A0 到A(n-1),向有多少对(,j)(0 <= i <j< n),Ai和Aj的差异值大于相似值.
假设A=5,B=3:则A的二进制表示101: B的二进制表示011:
则A与B的差异值二进制为110,相似值二进制为001; A与B的差异值十进制等于6,相似值十进制等于1,满足条件。
示例1
输入:
4
4 3 5 2
输出:
4
说明:
样例一解释:满足条件的分别是(0,1)(0,3) (1,2)(2,3),共4对
示例2
输入:
5
3 5 2 8 4
输出:
8
说明:
样例二解释:满足条件的分别是(0,1) (0,3) (0,4) (1,2) (1,3) (2,3)(2,4) (3,4)
解题思路:
- 本质上就是将数字转换成二进制后,异或的值 > 同或的值 的对数
- 比如:5和3
- 5的二进制 101
- 3的二进制 011
- 先判断二进制总的长度,不一样的话肯定不一样,长度不一样的话,再比较首个二进制是否不同
public class My {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
int n = Integer.parseInt(line);
String line1 = sc.nextLine();
String[] strings = line1.split(" ");
int[] nums = new int[strings.length];
for (int i = 0; i < strings.length; i++) {
nums[i] = Integer.parseInt(strings[i]);
}
int res = 0;
for (int i = 0; i < nums.length; i++) {
String binaryStringOne = Integer.toBinaryString(nums[i]);
for (int j = i + 1; j < nums.length; j++) {
//如果转换成二进制后,最高位不相同,那么异或后肯定大于同或
String binaryStringTwo = Integer.toBinaryString(nums[j]);
int len1 = binaryStringOne.length();
int len2 = binaryStringTwo.length();
//先判断二进制总的长度,不一样的话肯定不一样,长度不一样的话,再比较首个二进制是否不同
if (len1 != len2 || binaryStringOne.charAt(0) != binaryStringOne.charAt(0)) {
// System.out.println(" (" + i + ", " + j + ")");
res++;
}
}
}
System.out.println(res);
}
}