位运算-查找数组中唯一成对的数

基础实例一使用位运算判断数的奇偶性

  实例代码:

public class Test {public static void main(String[] args) {System.out.println(isOdd(49));System.out.println(isOdd(50));}//  与运算public static boolean isOdd(int i){return (i & 1) != 0;   // 奇数最后一位二进制为 1,偶数最后一位二进制为 0}
}

基础实例二:位运算判断一个数转为二进制后的第i位数是0还是1

  实例代码:

public class Test {public static void main(String[] args) {
        // 与运算  int x = 85;System.out.println("x的第五位二进制位的数为:" + ((((x&(1<<4))>>4)==1)?"1":"0"));// 比如85的二进制为1010101,我们将它的二进制与1向左移4位来做与运算// 就是 1010101 & 0010000 得出结果0010000 再右移4位 即可得出结果} }

基础实例三:位运算交换两个整数变量的值

  实例代码:

public class Test {// 异或运算public static void main(String args[]){int a=10;int b=20;a=a^b;b=b^a;a=a^b;System.out.println(a+"\t"+b);// 异或运算性质 x ^ x ^ y == y,因为x ^ x == 0,0 ^ y == y}
}

基础实例四:使用位运算,不用判断语句,求整数的绝对值

  实例代码: 

public class Test {// 异或运算public static void main(String args[]){System.out.println(my_abs(-53));System.out.println(my_abs(53));}public static int my_abs(int a){/*** 对一个数进行位运算,是在这个数的补码上运行的* 正数的补码是原码,负数的补码为原码除了最高的符号为,取反,然后加一* int 型,先右移31位取符号位 如果a位正数,i=0;a为负数,i=-1* 一个数与-1即与0xFFFFFFFF异或就相当与取反* 因此,a与i异或后再减i(因为i为0或-1,所以减i即是要么加0要么加1)也可以得到绝对值*/int i = a >> 31;return ((a ^ i) -i);}
}

异或运算特点:

  

题目一:找出唯一成对的数

  1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?

  解题思路:这里使用的原理是连续的数字异或可以消除重复,A ^ A=0,( A ^ A ) ^ B ^ ( C ^ C ) =B,但是我们的题目有两个元素重复,假如使用一次异或那么这个重复的元素就会被消掉了。所以这里有一个小技巧,就是使用两次异或,先对不包含重复值数组进行异或,在对包含重复值的数组进行异或,这样下来,就相当于除了重复值每个值都异或了两次,而重复的值异或了三次,这样异或下来,就只剩一个重复的值了,就成功找出来了。为了方便测试,这里只使用了11个元素的数组,自行改成1001即可(示例代码也给出了使用辅助存储空间的解法)。这里有一个特殊的点,就是这里给出了数组是1-1000连续的数并且只有唯一一个元素值重复,所以才能构造进行异或两次的解法。

  实例代码:

import java.util.Random;public class 唯一成对的数 {public static void main(String[] args) {int N = 11;int [] arr = new int[N];for (int i = 0; i < arr.length-1; i++) {arr[i] = i+1;}// 最后一个数,是随机数arr[arr.length-1] = new Random().nextInt(N-1)+1;// 随机下标int index = new Random().nextInt(N);swap(arr, index, arr.length-1);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+ "  ");}System.out.println();int x1=0;for(int i=1;i <= N -1;i++){x1 = (x1^i);   // 求得1到N-1这些连续的数的异或}for(int i=0;i < N ;i++){x1 = (x1^arr[i]);  // 再与原来的数组arr异或,这样重复的数就有三个,不重复的数有两个,异或消除重复后,剩下的就是重复的数了}System.out.println(x1);System.out.println("使用辅助空间实现============");int []helper = new int[N];for (int i = 0; i < helper.length; i++) {helper[arr[i]]++;}for (int i = 0; i < helper.length; i++) {if (helper[i]==2) {System.out.println(i);break;}}}public static void swap(int[] array,int x,int y){int xx = array[x];int yy = array[y];array[x] = yy;array[y] = xx;}}

  运行结果:

    

题目二:找出落单的那个数

  一个数组里除了某一个数字之外,其他的数字都出现了两次。请写出程序找出这个只出现一次的数字。

  解题思路:这个题目经过上一个题目的学习,就很简单了,直接进行异或即可。

  实例代码:

public class Test {// 异或运算public static void main(String args[]){int []a = {1,1,2,2,3,4,3};int x1 = 0;for (int i = 0; i < a.length; i++) {x1 = x1 ^ a[i];}System.out.println(x1);}
}

  

 

  

 

转载于:https://www.cnblogs.com/xiaoyh/p/10247283.html

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

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

相关文章

Docker实践:Cannot connect to the Docker daemon.

Docker实践&#xff1a;Cannot connect to the Docker daemon.查看docker daemon是否在运行 [rootlocalhost openec]# ps aux | grep dockerroot 3030 0.0 0.0 112656 984 pts/0 S 16:20 0:00 grep --colorauto docker启动docker[rootlocalhost openec]# ser…

linux虚拟终端时间短,使用Screen创建虚拟终端避免Linux远程断线

维护Linux的ssh工具在使用中&#xff0c;一旦遇到网络中断&#xff0c;则当前的shell就会自动关闭当前的工作进度就会丢失&#xff0c;这对于远程升级等比较耗费时间的工作是非常不利的对于远程调适代码也是很不可靠不安全的为此&#xff0c;可以使用screen这个工具来解决这个问…

中国第一软件开发_我第一次开发企业软件中学到的知识

中国第一软件开发In this article, I’ll share ten lessons I learned from my first project as a self-taught software developer. I was working for a consulting company at the time, and my official title was Software Engineer. The project I worked on was a web…

react-native-Cocoapods-Swift-Project

https://reactnative.cn/docs/integration-with-existing-apps/ 1、创建一个xcode工程&#xff0c;single View就行&#xff0c;项目语言选择swift&#xff0c;oc的直接生成就行不用这么麻烦。 2、把跟目录上创建 node的package.json,执行命令 npm init npm install react-nati…

用shell或者python写出各种图形

首先是shell等边三角形[roothxy my_script]# sh ff.sh num:6************************* *********** [roothxy my_script]# cat ff.sh #!/bin/bash ######################################################################### # File Name: ff.sh # Author: huxianyong # mai…

cfdiv2/c/找规律

题目连接 £&#xff1a;若n<4&#xff0c;NO&#xff1b; £&#xff1a;若n4,特判&#xff0c;n5&#xff0c;特判。 £&#xff1a;若n>6,用2-4组成24&#xff0c;1和5和6组成零&#xff0c;即可。 #include <set> #include <map> #includ…

linux lcd显示流程,求助 armlinux中实现lcd显示

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼/* for (bufIdx0; bufIdx < NUM_DISPLAY_BUFS-1; bufIdx) {fbp[bufIdx1] fbp[bufIdx] displaySize;}*/for(bufIdx0;bufIdx{buf(unsigned int *)fbp;for (i0; i < displaySize / sizeof(unsigned int); i) {buf[i] UYVY_BL…

android引入开源库_为好目录引入开源:通过代码帮助公益组织

android引入开源库by Michael D. Johnson迈克尔约翰逊(Michael D.Johnson) 为好目录引入开源&#xff1a;通过代码帮助公益组织 (Introducing the Open Source for Good Directory: Help Nonprofits with Code) A few months ago, we asked 20,000 people why they were learn…

第二阶段站立会议08

站立会议内容&#xff1a; 大家准备继续将代码进行融合&#xff0c;进行测试对一些功能进行优化。 1、会议照片&#xff1a; 2、任务展板&#xff1a; 3、燃尽图&#xff1a; 转载于:https://www.cnblogs.com/smcoder/p/7002539.html

ionic view 视图

ionic view 方法 $ionicView.loaded视图已经被加载了。这事件只发生一次当视图被创建并添加到Dom中。当跳出页面并且被缓存了的话&#xff0c;再次访问这个页面时这个时间将不会被激活。Loaded事件是个好方式让你为这个视图设置你的代码&#xff1b; 然而&#xff0c;他并不是…

ios开发 mvp实践_实践中开发人员的工作流程-我们如何在30天内建立​​MVP

ios开发 mvp实践by Lna Faure莱娜福雷(LnaFaure) 实践中开发人员的工作流程-我们如何在30天内建立​​MVP (The developer’s workflow in practice — how we built our MVP in 30 days) As a web developer, I often get to start projects from scratch and make decisions…

linux智能电压表设计与实现,毕业论文 智能数字电压表设计.doc

毕业论文毕业论文智能数字电压表设计智能数字电压表设计- PAGE I -摘要随着微电子技术和计算机技术的迅速发展&#xff0c;特别是单片机的出现和发展&#xff0c;使传统的电子测量仪器在原理、功能、精度及自动化水平等方面发生了巨大的变化&#xff0c;形成一种新一代的测量仪…

git——学习笔记(三)分支管理

一、创建、合并分支 每次提交&#xff0c;git都往后走一格&#xff0c;串成一跳时间线&#xff0c;head指向的是分支&#xff0c;分支指向提交。master是主分支&#xff0c;dev是另一条分支&#xff0c;分支就像指针一样&#xff0c;合并、删除分支时&#xff0c;修改的都是指针…

Redis 它是什么?它用来做什么?它的优势与短板如何?

阅读目的&#xff1a; 对什么是内存型数据库有概念性的认知。?Redis 是什么&#xff1f; 通常而言目前的数据库分类有几种&#xff0c;包括 SQL/NSQL,&#xff0c;关系数据库&#xff0c;键值数据库等等 等&#xff0c;分类的标准也不以&#xff0c;Redis本质上也是一种键值…

阿里巴巴是如何打通 CMDB,实现就近访问的?

CMDB在企业中&#xff0c;一般用于存放与机器设备、应用、服务等相关的元数据。当企业的机器及应用达到一定规模后就需要这样一个系统来存储和管理它们的元数据。有一些广泛使用的属性&#xff0c;例如机器的IP、主机名、机房、应用、region等&#xff0c;这些数据一般会在机器…

我们分析了成千上万的编程访谈。 这就是我们学到的东西。

by Aline Lerner通过艾琳勒纳(Aline Lerner) 我们分析了成千上万的编程访谈。 这就是我们学到的东西。 (We analyzed thousands of coding interviews. Here’s what we learned.) Note: I wrote most of the words in this post, but the legendary Dave Holtz did the heavy…

Java 9 新功能之 HTTP2 和 REPL

对Java 9的炒作将不再局限于模块化&#xff08;modularity&#xff09;&#xff0c;Java 9正在搜罗大量额外的功能模块&#xff0c;这些功能模块正作为Java增强提案&#xff08;JEP&#xff09;提交&#xff0c;并在OpenJDK (Java SE的参考实现项目&#xff09;中实现。 在这篇…

c语言编译程序首要工作,c语言试卷

c语言试卷一、选择题(每小题1分&#xff0c;共40分)。(以下A、B、C、D四个选项中只有一个是正确的。)1&#xff0e;一个C语言程序是由()。A&#xff0e;一个主程序和若干子程序组成B&#xff0e;函数C&#xff0e;若干过程组成D&#xff0e;若干子程序组成2&#xff0e;C语言源…

Mac通过wifi连接 Android设备

公司用的全是mac开发&#xff0c;但是全是type-C接口&#xff0c;每次背电脑回家啊&#xff0c;还得带个数据线转换器…… 想着回来&#xff0c;直接通过Wi-Fi连接手机就好&#xff0c;发现完全忘了之前套路&#xff0c;现在赶紧记下一波&#xff0c;保证包教包会&#xff01; …

贝叶斯统计推断_统计推断对决:频繁主义者与贝叶斯主义者

贝叶斯统计推断by Kirill Dubovikov通过基里尔杜博维科夫(Kirill Dubovikov) 统计推断对决&#xff1a;频繁主义者与贝叶斯主义者 (Statistical Inference Showdown: The Frequentists VS The Bayesians) 推理 (Inference) Statistical Inference is a very important topic t…