java数据结构与算法刷题-----LeetCode461. 汉明距离

news2024/11/27 12:57:27
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 异或统计1的个数
    • 2. 位移操作处理
    • 3. Brian Kernighan算法

在这里插入图片描述

位运算https://blog.csdn.net/grd_java/article/details/136119268

1. 异或统计1的个数

解题思路:时间复杂度O( 1 1 1),或者32,反正最多就是每个二进制为查一下,空间复杂度O( 1 1 1)
  1. 异或操作,两数相同异或为0,两数不相同异或为1
  2. 我们异或x和y后,统计结果二进制中,1的数量即可
代码
  1. 使用编程语言自带的计算二进制表达式中1的个数的函数
    在这里插入图片描述
class Solution {
    public int hammingDistance(int x, int y) {
        return Integer.bitCount(x ^ y);//统计x异或y后,1的个数
    }
}

2. 位移操作处理

解题思路:时间复杂度O( l o g 2 C log_2C log2C)C是数据范围,最多31,表示二进制的位数,空间复杂度O( 1 1 1)
  1. 法一是调用函数来统计1的个数
  2. 如果不能用函数呢?我们自己如何实现相同效果?
代码
  1. 通过位移操作,不断取x和y的最低位进行比较,如果不一样就统计
    在这里插入图片描述
class Solution {
    public int hammingDistance(int x, int y) {
        int ans = 0;//计数
        while(x!=0 || y!=0){//只要x或y都不是全0,就继续
            ans += (x & 1) != (y & 1)? 1 : 0;//x和y都取最低位,如果不一样,ans+1,否则ans+0
            x >>= 1;//统计最低位后,右移一位,将最低位移走,下一次比较最低位的高位
            y = y>>1;
        }
        //下面代码是上面代码的简化版
//        for(int i = 0;i<32;i++){//题目规定每个二进制有32位
//            int i1 = x >> i & 1;//让当前为移到最低位后通过&1操作取出
//            int i2 = y >> i & 1;
//            if (i1!=i2) ans++;//如果取出的最低位不一样,就ans+1
//        }
        return ans;
    }
}
  1. 异或后,通过位移操作统计1的个数。上面第二种实现方式,同时位移x和y,这里直接计算x^y后,统计1的个数即可
    在这里插入图片描述
class Solution {
    public int hammingDistance(int x, int y) {
        int ans = 0;//计数
        int i = x ^ y;//异或,不同位会置为1
        while(i!=0){//只要还有1就继续
            ans += i&1;//取最低位,是1就ans+1,否则ans+0
            i>>=1;//右移一位,将当前已经处理的最低位抛弃
        }
        return ans;
    }
}

3. Brian Kernighan算法

解题思路:时间复杂度O( l o g 2 C log_2C log2C)C是数据范围,最多31,表示二进制的位数,空间复杂度O( 1 1 1)
  1. x异或y后,我们需要统计1的个数
  2. 但是如果异或结果为100000000001.我们使用法2,需要对所有位进行处理,虽然我们一眼看到只有两个1,但是法二依然需要将所有的位数都处理一遍
  3. 我们如何跳过中间的0,直接统计1的个数呢?让上面这一串,只循环右移2次
  4. 针对这个问题,BK算法出现了,他利用了二进制的特性,实现一次性删除最右侧的1的效果
    在这里插入图片描述
  1. 对于十进制来说我们做减法时,低位不够减需要向高位借1,拿过来就是10
  2. 二进制也一样,不够减就得借1.拿过来就是2
  3. 也就是说,如果对2进制串进行-1操作的话,最低位是1还好,可以直接减去,如果不够减,就必须一直向高位借,直到遇到一个够借1的。这样就会将2进制串中,最后一个1借掉
  4. 例如上图中,x = 10001000,-1后最后一个1被借了,变成10000111
  5. 此时将这两个二进制串进行与运算,就会实现将最后一个1去掉的效果
  1. 我们能够这样用BK算法搞几次,就说明这个二进制串有几个1.直到其为0为止
代码

在这里插入图片描述

class Solution {
    public int hammingDistance(int x, int y) {
        int ans = 0;//计数
        int i = x ^ y;
        while(i!=0){
            i &= (i-1);//取最后面的1
            ans++;//取一次加一次1出现次数
        }
        return ans;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1587348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

构建强大的物联网平台系统架构:关键步骤与最佳实践

随着物联网&#xff08;IoT&#xff09;技术的快速发展和广泛应用&#xff0c;越来越多的企业开始意识到搭建一个强大而可靠的物联网平台系统架构的重要性。一个完善的物联网平台可以帮助企业高效地管理和监控各种连接设备&#xff0c;并实现数据的收集、处理和分析。在本文中&…

个人劳保用品穿戴检测系统 安全帽、工服、面罩、防护手套、防护鞋、安全背带穿戴检测等

背景 在工业生产、医疗护理、消防救援等高风险领域&#xff0c;正确穿戴个人防护装备或劳保用品&#xff08;PPE&#xff1a;Personal Protective Equipment&#xff09;是保障人员安全的重要措施&#xff0c;如安全帽、反光衣、安全背带等。然而&#xff0c;现实中往往会出现…

数据结构之排序了如指掌(一)

目录 题外话 正题 排序概念 稳定性 直接插入排序 直接插入排序代码详解 直接插入排序复杂度分析 希尔排序(缩小增量排序) 希尔排序代码详解 小结 题外话 昨晚肚子疼没睡好,今天博客写的确实有点晚(找个借口),我一定会坚持,不辜负热爱我的家人们!! 正题 排序概念 一串…

去掉el-date-picker弹窗默认回显当前月份的方法

打开日期弹窗&#xff0c;默认会显示当前月份&#xff0c;如图 会发现加了穿透&#xff1a;&#xff1a;v-deep 样式也不生效 .el-month-table .today .cell {color: pink&#xff1b;font-weight: 400;}要让 popper-class“xclass” :append-to-body“false” 这俩配合着使用…

[Kubernetes[K8S]集群:Slaver从节点初始化和Join]:添加到主节点集群内

文章目录 操作流程&#xff1a;上篇主节初始化地址&#xff1a;前置&#xff1a;Docker和K8S安装版本匹配查看0.1&#xff1a;安装指定docker版本 **[1 — 8] ** [ 这些步骤主从节点前置操作一样的 ]一&#xff1a;主节点操作 查看主机域名->编辑域名->域名配置二&#x…

StylizedGS: Controllable Stylization for 3D Gaussian Splatting

StylizedGS: Controllable Stylization for 3D Gaussian Splatting StylizedGS&#xff1a;3D高斯溅射的可控样式化 Dingxi Zhang, Zhuoxun Chen, Yu-Jie Yuan, Fang-Lue Zhang, Zhenliang He, Shiguang Shan, and Lin Gao1 张定西&#xff0c;陈卓勋&#xff0c;袁玉洁&#x…

赋能力量,幸福花开 ——罗湖区懿米阳光开启全职妈妈社工培育计划

最美人间四月天&#xff0c;不负春光不负卿。 四月&#xff0c;迎来了全国社会工作师考试报名的日子&#xff0c;罗湖区全职妈妈妇联与罗湖区阳光妈妈妇联在服务过程中发现&#xff0c;全职妈妈们有获得社会工作师职业资格证的需求&#xff0c;为了更好地针对这一需求&#xf…

关于部署ELK和EFLKD的相关知识

文章目录 一、ELK日志分析系统1、ELK简介1.2 ElasticSearch1.3 Logstash1.4 Kibana&#xff08;展示数据可视化界面&#xff09;1.5 Filebeat 2、使用ELK的原因3、完整日志系统的基本特征4、ELK的工作原理 二、部署ELK日志分析系统1、服务器配置2、关闭防火墙3、ELK ElasticSea…

使用 Axios 处理 AxiosError 的三种常见方法

在使用 Axios 时处理 AxiosError 有几种常见的方法: 使用 try-catch 语句捕获异常: try {const response await axios.get(/api/data);// 处理响应数据 } catch (error) {if (error.response) {// 请求成功但状态码不在 2xx 范围console.log(error.response.data);console.l…

三款好用的 Docker 可视化管理工具

文章目录 1、Docker Desktop1.1、介绍1.2、下载地址1.3、在Windows上安装Docker桌面1.4、启动Docker Desktop1.5、Docker相关学习网址 2、Portainer2.1、介绍2.2、安装使用 3、Docker UI3.1、介绍3.2、安装使用3.2.1、常规方式安装3.2.2、通过容器安装 Docker提供了命令行工具&…

Docker Redis Debian服务器版

1.使用官方安装脚本自动安装docker 安装命令如下&#xff1a; curl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.sh 如果安装提示 -bash sudo command not found 则需要 #update sudo apt-get update sudo apt-get install sudo再执行安装脚本1 安装…

STM32学习和实践笔记(9): 使用位带操作实现LED闪的实验

控制GPIO的那些寄存器&#xff0c;都在位带区。 根据上一篇讲的原理&#xff0c;要想每次只操作这些寄存的某一个bit而不影响别的bit&#xff0c;可以使用与这些bit相对应的位带别名区。 因此&#xff0c;在使用GPIO的位带操作之前&#xff0c;先要按上篇讲的原理&#xff0c…

从 Oracle 到 MySQL 数据库的迁移之旅

文章目录 引言一、前期准备工作1.搭建新的MySQL数据库2 .建立相应的数据表2.1 数据库兼容性分析2.1.1 字段类型兼容性分析2.1.2 函数兼容性分析2.1.3 是否使用存储过程&#xff1f;存储过程的个数&#xff1f;复杂度&#xff1f;2.1.4 是否使用触发器&#xff1f;个数&#xff…

知识图谱与人工智能:携手共进

知识图谱与人工智能&#xff1a;携手共进 一、引言&#xff1a;知识图谱与人工智能的融合 在这个数据驱动的时代&#xff0c;知识图谱与人工智能&#xff08;AI&#xff09;之间的融合不仅是技术发展的必然趋势&#xff0c;也是推动各行各业创新的关键。知识图谱&#xff0c;作…

[C++][算法基础]树的重心(树图DFS)

给定一颗树&#xff0c;树中包含 n 个结点&#xff08;编号 1∼n&#xff09;和 n−1 条无向边。 请你找到树的重心&#xff0c;并输出将重心删除后&#xff0c;剩余各个连通块中点数的最大值。 重心定义&#xff1a;重心是指树中的一个结点&#xff0c;如果将这个点删除后&a…

Unity之PlayableGraph实现动画的正播和倒播

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之PlayableGraph实现动画的正播和倒播 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&am…

python-study-day1

ps&#xff1a;前言 可做毕设&#xff0c;html&#xff0c;web&#xff0c;app&#xff0c;小程序&#xff0c;bug修改&#xff0c;可加急 作者自述 作为一名前端开发工程师&#xff0c;这个大环境不好的情况下&#xff0c;我试过我前端接单子但是没有后端&#xff0c…

Leetcode 239. 滑动窗口最大值和Leetcode 347. 前 K 个高频元素

目录标题 Leetcode 239. 滑动窗口最大值题目描述C语言代码和题解解题思路 Leetcode 347. 前 K 个高频元素题目描述C语言题解和思路解题思路 Leetcode 239. 滑动窗口最大值 题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最…

Java基础07--多线程-网络编程-Java高级

一、多线程 1.认识多线程 ①线程 ②多线程 2.创建线程方式 ①方式一&#xff1a;继承Thread类 1.让子类继承Thread线程类 2.重写run方法&#xff0c;就是这个线程执行会执行的操作。 3.创建继承Thread的子类对象就代表一个线程 4.启动线程:.start()-自动执行run方法 注意&am…

微服务demo(四)nacosfeigngateway(2)gatewayspringsercurity

一、思路 1、整体思路 用户通过客户端访问项目时&#xff0c;前端项目会部署在nginx上&#xff0c;加载静态文件时直接从nginx上返回即可。当用户在客户端操作时&#xff0c;需要调用后端的一些服务接口。这些接口会通过Gateway网关&#xff0c;网关进行一定的处理&#xff0…