有意思的位运算

来源:互联网 发布:java什么是进程和线程 编辑:程序博客网 时间:2024/06/07 22:05

笔试的时候遇到的几个比较有意思的关于位运算的题。

 

问题一

请编写一个算法,不用任何额外变量交换两个整数的值。

给定一个数组num,其中包含两个值,请不用任何额外变量交换这两个值,并将交换后的数组返回。

测试样例:
[1,2]
返回:[2,1]

 

  解法一:常规解法

<span style="font-size:18px;">import java.util.*;public class Compare {    public int getMax(int a, int b) {        // write code here          int c = a-b;        if(((c>>31)&1)==1){            return b;        }else{            return a;        }    }}</span>


 

解法二:位运算

 

<span style="font-size:18px;">public class Swap {     public int[] getSwap(int[] num) {         num[0] = num[0] ^ num[1];         num[1] = num[0] ^ num[1];         num[0] = num[0] ^ num[1];         return num;     } } </span>


 

问题二

对于两个32位整数a和b,请设计一个算法返回a和b中较大的。但是不能用任何比较判断。若两数相同,返回任意一个。

给定两个整数ab,请返回较大的数。

测试样例:
1,2
返回:2

 

解法:

<span style="font-size:18px;">import java.util.*;public class Compare {    public int getMax(int a, int b) {        // write code here          int c = a-b;        if(((c>>31)&1)==1){            return b;        }else{            return a;        }    }}</span>


问题三

有一个整型数组A,其中只有一个数出现了奇数次,其他的数都出现了偶数次,请打印这个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。
给定整形数组A及它的大小n,请返回题目所求数字。
测试样例:
[1,2,3,2,1],5
返回:3

解法:一个值与其本身异或,结果为0,一个值与0异或,结果为该值本身

 

<span style="font-size:18px;">import java.util.*;public class OddAppearance {    public int findOdd(int[] A, int n) {        // write code here        int a = 0;        for(int i=0;i<A.length;i++){            a = a^A[i];        }        return a;    }}</span>


 

问题4

给定一个整型数组arr,其中有两个数出现了奇数次,其他的数都出现了偶数次,找到这两个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。
给定一个整形数组arr及它的大小n,请返回一个数组,其中两个元素为两个出现了奇数次的元素,请将他们按从小到大排列。
测试样例:
[1,2,4,4,2,1,3,5],8
返回:[3,5]

 

解法:

<span style="font-size:18px;">import java.util.*;public class OddAppearance {    public int[] findOdds(int[] arr, int n) {        // write code here        if (n < 2)            return arr;        int a = 0;        for(int i=0;i<arr.length;i++){            a = a^arr[i];        }        int b = 1;        while((a&b)==0){            b = b<<1;        }        int c = 0;        for(int i=0;i<arr.length;i++){            if((arr[i]&b)!=0){                c = c^arr[i];            }        }        int d = a^c;        int[] s = new int[2];        if(d<c){            s[0] = d;            s[1] = c;        }else{            s[0] = c;            s[1] = d;        }        return s;                }}</span>

位运算在笔试与面试题目中属于神仙级的题目,我所能做的只能是碰到一个会一个。。。。哎。。。。。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为p9入水黑屏怎么办 农信密码忘记了怎么办 小米4g信号差怎么办 手机的调频调制器坏了怎么办 调制解调器的灯一直闪怎么办 691宽带用户名和密码无效怎么办 房间里有狐臭味怎么办 吃冰冻水果胃特别痛怎么办 小米5s屏幕闪烁怎么办 系统重装重启了怎么办 华为p10开不了机怎么办 眼镜腿夹的头疼怎么办 摩托车车头锁坏了怎么办 夏天骑摩托车戴头盔热怎么办 头盔玻璃罩边固定老是掉怎么办 电动车不戴头盔被扣车怎么办 郴州骑电动车没戴头盔怎么办 配置数据源时发现两个版本怎么办 微信占用内存3g怎么办 打印机显示内存已满怎么办 网页显示代理服务器连接失败怎么办 墙内线路断了怎么办 墙里的电线坏了怎么办 鱼竿最前端断了怎么办 下雨天墙壁与管道间漏水怎么办 电饭锅的电线被雨淋了怎么办 钢琴跨八度手短怎么办 弹钢琴手指不灵活怎么办呢? 理发剪不锋利了怎么办 室外宽带线断了怎么办 接宽带光纤太短怎么办 装修光纤网线太短怎么办 宽带入户线断了怎么办 电信有无线没网怎么办 墙里的网线断了怎么办 墙里网线断了怎么办 3根网线断了怎么办 剪了层次的头发怎么办 小米6充电线坏了怎么办 小米6导航信号弱怎么办 麦多多充不了电怎么办