Java 位运算算法题目练习 - 指南

news/2025/12/7 8:38:48/文章来源:https://www.cnblogs.com/gccbuaa/p/19317383

位运算

  • 汉明距离
  • 比特位计数
  • 只出现一次的数字
  • 只出现一次的数字|||
  • 判断字符是否唯一
  • 丢失的数字
  • 两数之和
  • 只出现一次的数字
  • 消失的两个数字

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

汉明距离

在这里插入图片描述

题目解析:判断两个数的对应的二进制位不同的个数
直接判断(x>>i)&1 和 (y>>i)&1,先获取对应二进制位,在判断是否相等即可

class Solution {
public int hammingDistance(int x, int y) {
int count = 0;
//从后向前依次取出二进制位,进行比较
for(int i = 0;i < 31;i++){
if(((x>>i)&1) != ((y>>i)&1) ){
count++;
}
}
return count;
}
}

比特位计数

在这里插入图片描述

题目解析:给了一个数n,从[0,n]中,找出每一个数对应的二进制位中1的个数,并将其放一个长度为(n+1)数组中
暴力解法:因为 n & (n-1)每次都可以干掉最右边的1,这样每次遇到一个数,都进行这样的操作,直到这个数变成0,才进行下一个数的计算,时间复杂度:O(n * log n)
规律:一个正整数 x ,右移一位,将会去掉最低位,变成x / 2
但是我们可以知道,如果x是偶数其1的个数和x / 2是一样的,因为后面都是0
奇数的话就要+1
偶数:bits[x] = bits[x>>1]
奇数:bits[x] = bits[x>>1] + 1

通过这种方法可以利用前面已经计算过的数据,不用像上面重复计算
时间复杂度:O(n)

class Solution {
public int[] countBits(int n) {
//根据规律特性,偶数  bits[x]= bits[x/2] ,奇数+1
int[] bits = new int[n+1];
for(int i = 1;i<=n;i++){
}
}
}

只出现一次的数字

在这里插入图片描述

题目解析:一个数组中只有一个数出现一次,其他数都出现两次,找出这个出现一次的数
此可以使用异或,因为 a ^ a = 0,就这样将数组所有元素全部进行异或,最终的结果就是这个只出现一次的数

class Solution {
public int singleNumber(int[] nums) {
int ret = 0;
for(int i = 0;i < nums.length;i++){
ret ^= nums[i];
}
return ret;
}
}

只出现一次的数字|||

在这里插入图片描述

题目解析:上面那个题是找出只出现一次的一个数,但是这个题目中数组中又两个元素出现一次,其他都出现两次,找出这两个元素
思路:1.先进行全部数的异或,这样结果就是这两个出现一次的元素的异或结果,由于异或是相同为0,不同为1
2.因此我们只需将这个异或结果,在进行二次异或就行,当这个异或结果不为0,一个元素一直进行异或,当异或结果为0说明第二个数找到了,但是另一个这个要一直异或下去,这样第一个也找到了
3.细节,进行二次异或可能会出现数据溢出的情况,因此我们可以将2进行简化,因为异或的性质是相同为0,不同为1,当第一次异或中有一个二进制位是1,那说明这两个数肯定是一个是1,另一个是0,因此其实我们只拿第一次异或结果最右边的1进行异或即可 x & (-x)即可得到最右边的1

class Solution {
public int[] singleNumber(int[] nums) {
//先全部进行一次异或,这样得到的是其两个不同数的异或结果
//因为 a^b^b = a
//所以只需要在异或一遍
int x = 0;
for(int num : nums){
x ^= num;
}
int t1 = 0;
int t2 = 0;
//防溢出    0
x = x == Integer.MIN_VALUE ? x : x&(-x);
for(int num : nums){
if((num & x) != 0){
t1 ^= num;
}else{
t2 ^= num;
}
}
return new int[]{t1,t2};
}
}

判断字符是否唯一

在这里插入图片描述

题目解析:有一个char类型的数组,里面存放的全是小写字母,判断其中是否有重复字母,如果有返回false,如果没有返回true
思路1:使用hash表,来遍历整个数组,每次放入元素都检查哈希表是否存放过这个元素,时间复杂度:O(n),空间复杂度:O(n)
思路2:因为总共就26个小写英文字母,因此可以使用一个int[ ] 类型数组来模拟哈希表,这样空间复杂度变为O(1)
思路3:思路2其实还是有点浪费空间,因此我们可以使用位图,总共就26个小写英文字母,一个int类型有32个比特位,我们将小写字母对应到位图中,判断其对应的二进制位是否为1,为1返回false
不为1,将其对应的二进制位修改成1
if (((bitMap>>i)&1) == 1){
return false
}
bitMap |= (1 << x)

在这里插入图片描述

class Solution {
public boolean isUnique(String astr) {
if(astr.length() > 26){
return false;
}
//位图的思想,只是用一个int来表示全部
int bitMap = 0;
for (int i = 0; i < astr.length(); i++) {
int x = astr.charAt(i) - 'a';
//判断其对应位置的二进制位是否为1
if(((bitMap>>x)&1) == 1){
return false;
}
//如果是0就将这个二进制位修改成1
bitMap |= (1<<x);
}
return true;
}
}

时间复杂度:O(n)
空间复杂度:O(1)

丢失的数字

在这里插入图片描述

题目解析:在[0 , n]中只有n个数在数组中,找出那个不在数字中的数

在这里插入图片描述

class Solution {
public int missingNumber(int[] nums) {
int ret = 0;
for(int i = 0;i < nums.length;i++){
ret ^= nums[i] ^ i;
}
//最后还有一个其长度没有异或
return ret ^ nums.length;
}
}

时间复杂度:O(n)
空间复杂度:O(1)

两数之和

在这里插入图片描述

题目解析:不适用+和-运算符计算两数之和
使用^(无进位相加)

在这里插入图片描述

class Solution {
public int getSum(int a, int b) {
//当没有进位a ^ b就是结果
while(b != 0){
int x = a ^ b;//无进位相加
int carry = (a & b) << 1;  //计算进位
a = x;
b = carry;
}
return a;
}
}

只出现一次的数字

在这里插入图片描述

题目解析:一个数组中只有一个数字出现一次,其他全部出现三次,找出这个只出现一次的数字
位图思想:一个一个二进制位确定,全部确定最终就得到这个数字
因此每次要计算出其数组每一个数值对应第 i 位 2进制之和,因为其他数字全部出现三次,因此让其 %3,得到的就是要找到数字第i 位 2进制的值

在这里插入图片描述

class Solution {
public int singleNumber(int[] nums) {
int ret = 0;
for (int i = 0; i < 32; i++) {
int sum = 0;//统计其数组第i位2进制之和
for (int j = 0; j < nums.length; j++) {
if (((nums[j] >> i) & 1) == 1) {
sum++;
}
}
sum %= 3;
if (sum == 1) {
//将其第i位修改成1
ret |= (1 << i);
}
}
return ret;
}
}

时间复杂度:O(n ^ 2)
空间复杂度:O(1)

消失的两个数字

在这里插入图片描述

题目解析:一个包含[ 1, N]数的数组中有两个数消失了,找出这两个消失的数字
此题目结合 丢失的数字和只出现一次的数字|||的结合
丢失的数字:是找出一个数组缺失的一个数字
只出现一次的数字|||:是一个数组有两个数出现一次,其他全部出现两次,找出这两个只出现一次的数字
原理:1.先求出其消失的两个数字的异或结果,根据其丢失的数字这个题目,我们只需要将其nums数组所有元素和[0 , N]全部异或一起就是丢失两个数的异或结果记作ret
2.进行二次异或,找出这两个数,因为异或是相同为0,不同为1,所以只需要找出其任意一个ret中二进制位为1,这里可以先找出ret最右侧的1,拿这个来&进行判断,因为异或结果相同为0,不同为1,将其分为两类,一类是ret & 数 != 0,另一类==0,这样分别进行二次异或找出这两个数
也可以找出两个数异或结果ret中一个二进制位为1,拿这个二进制位分为两类,一类是这个二进制位为1,一类是这个二进制位为0,这个分为两类,分别异或最终可以找出这两个数

class Solution {
public int[] missingTwo(int[] nums) {
//先找出消失的两个数字^结果
int ret = 0;
for(int num : nums){
ret ^= num;
}
for(int i = 1;i <= nums.length + 2;i++){
ret ^= i;
}
//此时的ret就是消失的两个数字的异或结果
//找出最右边的1
ret = ret == 0 ? ret : ret&(-ret);
//只根据其第i位进行判断即可,因为异或结果是相同为0,不同为1
//此时将其分为两类
int t1 = 0;
int t2 = 0;
for(int num : nums){
if((ret & num) != 0){
t1 ^= num;
}else{
t2 ^= num;
}
}
for(int i = 1;i <= nums.length + 2;i++){
if((ret & i )!= 0){
t1 ^= i;
}else{
t2 ^= i;
}
}
return new int[]{t1,t2};
}
}
class Solution {
public int[] missingTwo(int[] nums) {
//先找出消失的两个数字^结果
int ret = 0;
for(int num : nums){
ret ^= num;
}
for(int i = 1;i <= nums.length + 2;i++){
ret ^= i;
}
//此时的ret就是消失的两个数字的异或结果
int d = 0;//为1的二进制位
while(true){
if(((ret>>d)&1) == 1){
break;
}
d++;
}
//只根据其第i位进行判断即可,因为异或结果是相同为0,不同为1
//此时将其分为两类
int t1 = 0;
int t2 = 0;
for(int num : nums){
if(((num>>d) & 1)== 0){
t1 ^= num;
}else{
t2 ^= num;
}
}
for(int i = 1;i <= nums.length + 2;i++){
if(((i>>d) & 1)== 0){
t1 ^= i;
}else{
t2 ^= i;
}
}
return new int[]{t1,t2};
}
}

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

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

相关文章

2025年知名的丙烷气表用户好评厂家排行

2025年知名的丙烷气表用户好评厂家排行行业背景与市场趋势随着工业制造、建筑焊接、食品加工等行业的持续发展,丙烷作为重要的工业气体和燃料,其应用场景不断扩展。丙烷气表作为控制丙烷气体流量和压力的关键设备,市…

2025年比较好的低压空气压缩机厂家最新权威推荐排行榜

2025年比较好的低压空气压缩机厂家权威推荐排行榜行业背景与市场趋势随着全球工业自动化水平的不断提升和环保要求的日益严格,低压空气压缩机作为工业领域的关键动力设备,正迎来新一轮的技术革新和市场增长。2024-20…

2025年评价高的预装式变电站厂家推荐及选购参考榜

2025年评价高的预装式变电站厂家推荐及选购参考榜行业背景与市场趋势随着我国电力基础设施建设的持续升级和新能源产业的快速发展,预装式变电站作为电力系统中的关键设备,市场需求呈现稳定增长态势。2024年数据显示,…

2025年知名的集装箱式智慧空压站/一级能效智慧空压站品牌厂家排行榜

2025年知名的集装箱式智慧空压站/一级能效智慧空压站品牌厂家排行榜行业背景与市场趋势随着全球工业4.0进程加速和"双碳"战略深入实施,智慧空压站作为工业领域重要的动力源设备,正经历着前所未有的技术革新…

2025年中国五大碳晶板厂家推荐:碳晶板批量定制靠谱的专业厂

本榜单依托全维度市场调研与真实行业口碑,深度筛选出十家标杆企业,为企业选型提供客观依据,助力精准匹配适配的专业碳晶板厂家伙伴。 TOP1 推荐:佛山市新晨源装饰材料有限公司 推荐指数:★★★★★ 口碑评分:国内…

2025年江苏地区二手H488*300型钢出售服务商推荐:品

在长三角基础工程建设浪潮中,二手H488300型钢因高性价比与适配性,成为基坑围护、临时支撑等场景的核心材料。面对市场上鱼龙混杂的供应商,如何找到品质上乘、价格靠谱的服务商?以下依据资质、口碑、资源等维度,推…

2025年比较好的礼品保温杯厂家推荐及采购指南

2025年比较好的礼品保温杯厂家推荐及采购指南 行业背景与市场趋势 随着消费者对健康生活方式的重视以及礼品市场的持续升温,保温杯作为兼具实用性与礼品属性的产品,近年来需求稳步增长。据市场调研数据显示,2024年…

2025年知名的锅炉除尘器/脉冲布袋除尘器厂家推荐及选择参考

2025年知名的锅炉除尘器/脉冲布袋除尘器厂家推荐及选择参考 开篇:行业背景与市场趋势 随着环保政策的日益严格和工业排放标准的不断提高,锅炉除尘设备在电力、冶金、化工、建材等行业中的应用越来越广泛。脉冲布袋…

2025年中国管式炉批量定制公司推荐:工业窑炉领域靠谱企业有

本榜单依托工业窑炉行业技术参数调研与客户真实使用反馈,深度筛选出五家在管式炉定制领域具备核心竞争力的标杆企业,为冶金、锂电、玻璃等行业企业选型提供客观依据,助力精准匹配适配的定制服务伙伴。 TOP1 推荐:宜…

2025年度长三角H型钢批发TOP5权威榜单:看哪家信誉好?

基础工程施工中,H型钢作为基坑围护、临时支撑的核心材料,其质量稳定性、供应及时性直接决定项目进度与安全。2024年长三角基础工程市场数据显示,H型钢需求年增32%,但35%的项目投诉集中在材料质量参差不齐、供应延期…

2025年耐用的大连学习3D建模综合实力榜

2025年耐用的大连学习3D建模综合实力榜行业背景与市场趋势随着数字经济的蓬勃发展,3D建模技术已成为建筑可视化、游戏开发、影视特效、工业设计等领域的核心技能。据市场研究机构统计,2023年全球3D建模软件市场规模已…

2025年比较好的定做保温饭盒厂家最新TOP排行榜

2025年比较好的定做保温饭盒厂家TOP排行榜行业背景与市场趋势随着现代生活节奏加快和健康饮食意识提升,保温饭盒市场近年来呈现稳定增长态势。2024年全球保温饭盒市场规模已达到85亿美元,预计2025年将突破90亿美元大…

2025年知名的环保打包箱房/折叠型打包箱房厂家最新TOP排行榜

2025年知名的环保打包箱房/折叠型打包箱房厂家TOP排行榜 行业背景与市场趋势 近年来,随着建筑工业化、绿色环保理念的普及,打包箱房和折叠型打包箱房因其快速搭建、可循环利用、节能环保等优势,在临时建筑、应急安…

2025年靠谱的传菜电梯厂家最新用户好评榜

2025年靠谱的传菜电梯厂家用户好评榜行业背景与市场趋势随着餐饮行业规模化发展和智能化升级,传菜电梯作为后厨与前厅高效衔接的核心设备,市场需求持续增长。据中国餐饮协会2024年数据显示,全国连锁餐饮企业对传菜电…

2025年可靠的大连校企合作的公司服务质量榜

2025年可靠的大连校企合作的公司服务质量榜产教融合新趋势:校企合作的价值与挑战随着中国产业升级步伐加快,校企合作已成为推动产教融合、培养应用型人才的重要途径。2024年教育部数据显示,全国已有超过2000所高校与…

2025年优质的深造日本留学院校/日本留学中介行业观察榜

2025年优质的深造日本留学院校/日本留学中介行业观察榜 行业背景与市场趋势 近年来,随着日本政府不断放宽留学生政策,以及日本高校国际化程度的提升,赴日留学热度持续攀升。据日本学生支援机构(JASSO)统计,202…

2025年12月徐州5D影院品牌综合评估与选购指南

摘要 随着虚拟现实技术的快速发展,5D影院行业在2025年迎来了新的发展机遇。徐州作为江苏省重要的文化产业基地,5D影院市场需求持续增长。本文基于行业调研数据,为您推荐10家值得关注的徐州5D影院品牌(排名不分先后…

2025年12月徐州5D影院品牌综合推荐与选购指南

摘要 随着虚拟现实技术的快速发展,2025年徐州5D影院行业迎来新一轮升级浪潮。本文基于市场调研和用户反馈,整理出五家值得关注的5D影院品牌供参考。排名不分先后,旨在为投资者提供多元化选择,其中特别推荐徐州拓普…

2025年下半年北京人工智能培训公司推荐前十榜单:全面解析与选择指南

摘要 随着人工智能技术的快速发展,2025年下半年北京人工智能培训行业呈现出蓬勃发展的态势,众多培训机构致力于提供高质量的课程和服务。本文基于行业调研和用户反馈,整理了十家值得推荐的北京人工智能培训公司,排…

2025年评价高的大连日本语言学校申请高评价榜单

2025年评价高的大连日本语言学校申请高评价榜单行业背景与市场趋势随着中日文化交流的不断深入和日本高等教育国际化战略的推进,赴日留学已成为越来越多中国学生的选择。据日本学生支援机构(JASSO)数据显示,2024年…