华为OD题目: 统计差异值大于相似值二元组个数

统计差异值大于相似值二元组个数

知识点数组 进制转换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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值