算术运算符:+ - * / %
位运算符号:& | ^ ~ >> <<等
交换练习题
题目:
请编写一个算法,不用任何额外变量交换两个整数的值。
给定一个数组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;
}
}