位运算

算术运算符:+ - * / %
位运算符号:& | ^ ~ >> <<等

交换练习题

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

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

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

代码:

import java.util.*;

public class Swap {
    public int[] getSwap(int[] num) {
        //边界条件判定
        if(num==null||num.length!=2){
            return null;
        }

        //使用位运算中的^异或运算求解
        //自己与自己异或的结果为0
        num[0] = num[0] ^ num[1];
        num[1] = num[1] ^ num[0];
        num[0] = num[1] ^ num[0];

        return num;
    }
}

寻找奇数出现练习题

题目:
有一个整型数组A,其中只有一个数出现了奇数次,其他的数都出现了偶数次,请打印这个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。

给定整形数组A及它的大小n,请返回题目所求数字。

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

代码:

import java.util.*;

public class OddAppearance {
    public int findOdd(int[] A, int n) {

        int e = 0;
        //根据异或运算性质异或即可
        for(int i=0;i<n;i++){
            e = e ^ A[i];
        }

        return e;
    }
}

寻找奇数变形题目

题目:
给定一个整型数组arr,其中有两个数出现了奇数次,其他的数都出现了偶数次,找到这两个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。

给定一个整形数组arr及它的大小n,请返回一个数组,其中两个元素为两个出现了奇数次的元素,请将他们按从小到大排列。

测试样例:
[1,2,4,4,2,1,3,5],8
返回:[3,5]

代码:

import java.util.*;

public class OddAppearance {
    public int[] findOdds(int[] arr, int n) {
        //定义两个整数
        int e1 = 0;
        int e2 = 0;

        //首先异或遍历一边所有元素,求的两个奇数的异或值
        for(int i=0;i<n;i++){
            e1 = e1 ^ arr[i];
        }

        //因为两个出现奇数次的数肯定不想等,所以必然会出现e1的某一个bit位置上数字为1,其实也代表了
        //两个奇数次数字其中有一个的第K位的bit位为1
        //再遍历一遍,异或第k个位置上bit位为1的数字,即可得到bit为1的数字,即是两个奇数次数字中的一个
        int k = 1;
        while(((e1>>k)&1)!=1){
            k++;
        }

        for(int i=0;i<n;i++){
            if(((arr[i]>>k)&1)==1){
                e2 = e2 ^ arr[i];
            }

        }

        int[] result = new int[2];
        e1 = e2 ^ e1;
        result[0] = Math.min(e1,e2);
        result[1] = Math.max(e1,e2);

        return result;


    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值