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

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+0x >>= 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;//异或,不同位会置为1while(i!=0){//只要还有1就继续ans += i&1;//取最低位,是1就ans+1,否则ans+0i>>=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);//取最后面的1ans++;//取一次加一次1出现次数}return ans;}
}

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

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

相关文章

机器学习和深度学习--李宏毅(笔记与个人理解)Day11-12

Day11 when gradient is small…… 怎么知道是局部小 还是鞍点&#xff1f; using Math 这里巧妙的说明了hessan矩阵可以决定一个二次函数的凹凸性 也就是 θ \theta θ 是min 还是max&#xff0c;最后那个有些有些 哈 是一个saddle&#xff1b; 然后这里只要看hessan矩阵是不…

图形学基础:二维三维刚体的移动、缩放和旋转矩阵

一、二维 1.1 缩放矩阵 x&#xff0c;y分别表示在x轴&#xff0c;y轴缩放的倍数 示例&#xff1a; 1.2 平移矩阵 x&#xff0c;y分表表示在x轴&#xff0c;y轴上移动的距离 示例&#xff1a; 1.3 旋转矩阵 θ 表示点绕原点逆时针旋转θ 示例&#xff1a; 点 (2,1) 绕原点旋转…

MapReduce过程解析

一、Map过程解析 Read阶段&#xff1a;MapTask通过用户编写的RecordReader&#xff0c;从输入的InputSplit中解析出一个个key/value。Map阶段&#xff1a;将解析出的key/value交给用户编写的Map()函数处理&#xff0c;并产生一系列的key/value。Collect阶段&#xff1a;在用户编…

从 SQLite 3.5.9 迁移到 3.6.0(二十一)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;从 SQLite 3.4.2 迁移到 3.5.0&#xff08;二十&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​SQLite 版本 3.6.0 &#xff08;2008-07-16&#xff09; 包含许多更改。按照惯例 SQLite项目&#xff…

Swagger API 文档 | 技术选型

文章目录 必备知识选型方案 1:SpringFox选型方案 2:springdoc-openapi选型方案 3:Knife4j方案对比相关博文😂 背景 老项目是 SpringMVC 框架,使用的是 SpringFox 2.8.0 实现的 API 文档。新项目是 SpringBoot 3.x 框架,发现 SpringFox 已经停更了,故有了此次 API 文档的…

怎么在外地控制自家的电视

怎么在外地控制自家的电视 随着科技的进步和智能家居的普及&#xff0c;远程控制家中的电器设备已经成为现实。电视作为家庭娱乐的中心&#xff0c;远程控制功能更是备受关注。那么&#xff0c;如何在外地控制自家的电视呢&#xff1f;本文将为你提供详细的步骤和有价值的信息…

为什么要“挺”鸿蒙?

鸿蒙到底是什么&#xff1f; 随着5G、物联网等技术的快速发展&#xff0c;智能终端设备的应用场景也越来越广泛。为了满足不同设备间的互联互通需求&#xff0c;华为在2019年推出了自主研发的操作系统——鸿蒙OS。值得关注的是&#xff0c;这也是首款国产操作系统。 要了解鸿…

UE5学习日记——制作多语言版本游戏,同时初步学习UI制作、多语言化、控制器配置、独立进程测试、打包配置和快速批量翻译等

所有的文本类&#xff0c;无论变量还是控件等都能实现本地化&#xff0c;以此实现不同语言版本。 在这里先将重点注意标注一下&#xff1a; 所有文本类的变量、控件等都可以多语言&#xff1b;本地化控制板中收集、编译时&#xff0c;别忘了编译这一步&#xff1b;支持批量复制…

一探究竟:选择排序原理、实现与应用分析

在众多基础排序算法中&#xff0c;选择排序以其独特的工作机制和稳定的性能表现&#xff0c;吸引了众多算法学习者的关注。本文将深入剖析选择排序的原理、详细实现步骤&#xff0c;以及其在实际应用中的表现与适用场景&#xff0c;助您全面理解这一经典排序算法。 一、选择排…

ClickHouse--16--普通函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、日期函数1、时间或日期截取函数&#xff08;返回非日期&#xff09;2、时间或日期截取函数&#xff08;返回日期&#xff09;3、日期或时间日期生成函数 二、类…

PTA 应急救援站选址(floyd+打印路径)

大学城虎溪社区有很多居民小区&#xff0c;居民小区道路图是连通的。现要在该社区新建一个应急救援站&#xff0c;且该应急救援站要和某个小区建在一起。为了使应急救援最快速&#xff0c;经各部门商量决定&#xff1a;应急救援站建好后&#xff0c;离应急救援站最远的小区到应…

使用 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…

React Hooks全面解读与高效开发实践

React Hooks是React 16.8版本引入的新特性&#xff0c;它可以让函数式组件具有类组件的能力。通过使用Hooks&#xff0c;我们可以在不编写类的情况下&#xff0c;使用状态&#xff08;state&#xff09;和其他React特性&#xff0c;使得组件的开发更加简单和高效。 在React中&…

Git - 设置全局用户名和邮箱

环境信息 Git 版本信息&#xff1a; $ git --version git version 2.33.0.windows.1设置全局用户名和邮箱 设置全局用户名&#xff1a; $ git config --global user.name "hello"设置全局邮箱&#xff1a; $ git config --global user.email "1234567890qq…

Web刷题记录——不翼而飞的余额

一、代码及思路解析 1、创建路由 // TODO&#xff1a;待补充代码&#xff0c;在此引入路由相关 API const { createRouter,createWebHistory } VueRouter; // TODO:待补充代码&#xff0c;为项目配置 history 模式的路由 const router createRouter({// 1、配置路由模式[…

单例模式以及常见的两种实现模式

单例模式是校招中最常考的设计模式之一. 设计模式其实就是类似于“规章制度”&#xff0c;按照这个套路来进行操作。 单例模式能保证某个类在程序中只存在唯一 一份实例。而不会创建出多个实例&#xff0c;如果创建出了多个实例&#xff0c;就会编译报错。而不会创建出多个实…

element-ui backtop 组件源码分享

今日简单分享 backtop 组件的源码实现&#xff0c;从以下三个方面&#xff1a; 1、backtop 组件页面结构 2、backtop 组件属性 3、backtop 组件事件 一、backtop 组件页面结构 二、backtop 组件属性 2.1 target 属性&#xff0c;触发滚动的对象&#xff0c;类型 string&am…

Java 流(Stream)、文件(File)和IO

Java 流(Stream)、文件(File)和IO 目录 Java 流(Stream)、文件(File)和IO 读取控制台输入 从控制台读取多字符输入 从控制台读取字符串 控制台输出 实例 读写文件 FileInputStream FileOutputStream 实例 文件和I/O Java中的目录 创建目录&#xff1a; 读取目录 Ja…

GitLab介绍、安装、创建第一个项目

一、Gitlab介绍 GitLab是一个基于Web的DevOps平台,提供了Git仓库管理、问题跟踪、代码审查、CI/CD等一系列功能。它由Dmitriy Zaporozhets和Valery Sizov于2011年创建,旨在为开发团队提供一个集中式的项目管理解决方案。以下是GitLab的一些关键特点和功能: 1、代码管理 提供…

JavaGUI编程

目录 GUI概念 Swing概念 组件 容器组件 窗口&#xff08;JFrame&#xff09; 代码 运行 面板&#xff08;JPanel&#xff09; 代码 运行 布局管理器 FlowLayout 代码 运行 BorderLayout 代码 运行 GridLayout 代码 运行 常用组件 标签(JLabel) 代码 运…