统计两数「二进制表示中不同位」个数的几种方式 | Java 刷题打卡

简介: 统计两数「二进制表示中不同位」个数的几种方式 | Java 刷题打卡

网络异常,图片无法展示
|


逐位比较



本身不改变 xxyy,每次取不同的偏移位进行比较,不同则加一。


循环固定取满 3232


网络异常,图片无法展示
|


代码:


class Solution {
    public int hammingDistance(int x, int y) {
        int ans = 0;
        for (int i = 0; i < 32; i++) {
            int a = (x >> i) & 1 , b = (y >> i) & 1;
            ans += a != b ? 1 : 0;
        }
        return ans;
    }
}
复制代码


  • 时间复杂度:O(C)O(C)CC 固定为 3232
  • 空间复杂度:O(1)O(1)


右移统计



每次都统计当前 xxyy 的最后一位,统计完则将 xxyy 右移一位。


xxyy 的最高一位 11 都被统计过之后,循环结束。


网络异常,图片无法展示
|


代码:


class Solution {
    public int hammingDistance(int x, int y) {
        int ans = 0;
        while ((x | y) != 0) {
            int a = x & 1, b = y & 1;
            ans += a ^ b;
            x >>= 1; y >>= 1;
        }
        return ans;
    }
}
复制代码


  • 时间复杂度:O(C)O(C)CC 最多为 3232
  • 空间复杂度:O(1)O(1)


lowbit



熟悉树状数组的同学都知道,lowbit 可以快速求得 xx 二进制表示中最低位 11 表示的值。


因此我们可以先将 xxyy 进行异或,再统计异或结果中 11 的个数。


网络异常,图片无法展示
|


代码:


class Solution {
    int lowbit(int x) {
        return x & -x;
    }
    public int hammingDistance(int x, int y) {
        int ans = 0;
        for (int i = x ^ y; i > 0; i -= lowbit(i)) ans++;
        return ans;
    }
}
复制代码


  • 时间复杂度:O(C)O(C)CC 最多为 3232
  • 空间复杂度:O(1)O(1)
相关文章
|
4月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
48 0
|
6月前
|
Java Serverless
Java字符个数统计代码
Java字符个数统计代码
92 6
|
6月前
|
算法 Java Go
【经典算法】LeetCode 67. 二进制求和(Java/C/Python3/Golang实现含注释说明,Easy)
【经典算法】LeetCode 67. 二进制求和(Java/C/Python3/Golang实现含注释说明,Easy)
87 2
|
6月前
|
Java
剑指offer_3_前n个数字二进制形式中1的个数(java)
剑指offer_3_前n个数字二进制形式中1的个数(java)
|
6月前
|
Java
剑指offer_2_二进制加法(java)
剑指offer_2_二进制加法(java)
|
6月前
|
Java
java使用Files.walkFileTree统计文件夹下的文件夹和文件数量
java使用Files.walkFileTree统计文件夹下的文件夹和文件数量
|
6月前
|
Java
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
58 0
|
6天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
37 6
|
21天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
19天前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
下一篇
DataWorks