蓝桥杯 java 算法练习题 位运算的运用 1~1000这1000个数存放在一个1001个元素的数组中 其中只有一个数值是重复的 找出其中重复的元素 不用辅助存储空间 解题思路
将每个数组的每个元素与数组的每个元素做异或 因为相同元素做异或为0 所以重复的元素会多出来 这样就可以找到重复的元素了
不用辅助存储空间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 public static void main (String[] args) { int N = 1001 ; Integer[] arr = new Integer[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); ArrOperate.swap(arr,index,arr.length - 1 ); ArrOperate.printArr(arr); int x1 = 0 ; for (int i = 1 ; i <= arr.length - 1 ; i++) { x1 = (x1 ^ i); } for (int i = 0 ; i < arr.length; i++){ x1 = x1 ^ arr[i]; } System.out.println(x1); }
使用辅助存储空间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 public static void main (String[] args) { int N = 10 ; Integer[] arr = new Integer[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); ArrOperate.swap(arr,index,arr.length - 1 ); ArrOperate.printArr(arr); int [] arr2 = new int [N]; for (int i = 0 ; i < arr2.length; i++){ arr2[arr[i]]++; } for (int i = 0 ; i < arr2.length; i++){ if (arr2[i] == 2 ){ System.out.println(i); break ; } } }
一个数组除了某一个数字之外 其他的数字都出现了两次 找出落单的那个数 解题思路
因为其他数字都出现两次 所以可连续做异或 因为相同异或为0 任何数与0异或是其本身
1 2 3 4 5 6 7 8 9 10 11 12 public static void main (String[] args) { Integer[] arr = new Integer[]{1 ,2 ,3 ,4 ,5 ,1 ,2 ,4 ,5 }; int result = 0 ; for (int i = 0 ; i < arr.length; i++){ result ^= arr[i]; } System.out.println(result); }
一个整数 求出该二进制中1的个数 解题思路
先将整数转换成二进制数 依次判断每个位上的数是否为1
位运算方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public static void main (String[] args) { int number = new Random().nextInt(100 ); int qjNumber = number; int result = 0 ; while (number != 0 ){ if ((number & 1 ) == 1 ){ result++; } number = number >> 1 ; } System.out.println(Integer.toString(qjNumber,2 )); System.out.println(qjNumber + "中1的位数为" + result); }
普通方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public static void main (String[] args) { int number = new Random().nextInt(100 ); int qjNumber = number; String result = "" ; int yuShu = 0 ; while (number != 0 ){ yuShu = number % 2 ; number = number / 2 ; result += yuShu; } char [] ejz = result.toCharArray(); int sum = 0 ; for (int i = 0 ; i < ejz.length; i++){ if (ejz[i] == '1' ){ sum++; } } System.out.println(Integer.toString(qjNumber,2 )); System.out.println(qjNumber + "的二进制中有" + sum + "位是1" ); }
用一条语句判断一个整数是不是2的整数次方 解题思路
因为2的整数次方有个规律 就是当前数减1 与 当前数做与运算总是为0 所以按照这个解题即可
2 -> 0000 0010 2-1= 1 -> 0001
4 -> 0000 0100 4-1=3 -> 0011
8 -> 0000 1000 8-1=7 -> 0111
1 2 3 4 5 6 7 8 9 10 public static void main (String[] args) { Scanner scanner = new Scanner(System.in); int number = scanner.nextInt(); System.out.println(((number - 1 ) & number) == 0 ?"是2的整数次方" : "不是2的整数次方" ); }
将整数二进制位的奇偶位互换 解题思路
首先将原二进制数用1010 1010 1010 …进行与运算 这时会得到 原二进制数0原二进制数0 原二进制数0原二进制数0 原二进制数0原二进制数0 … 这时再重新将原二进制与 0101 0101 0101 … 进行与运算 这时会得到 0原二进制数0原二进制数 0原二进制数0原二进制数 0原二进制数0原二进制数 … 这时将一个二进制进行左移一位 一个二进制进行右移一位 然后异或即可得到二进制的奇偶位交换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public static void main (String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); System.out.println(Integer.toString(a,2 )); int ou = a & 0xaaaaaaaa ; int ji = a & 0x55555555 ; int b = (ou >> 1 ) ^ (ji << 1 ); System.out.println(Integer.toString(b,2 )); }
零到一之间浮点实数的二进制表示 解题思路
就是正常的计算小数转换成二进制的计算方法即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public static void main (String[] args) { Scanner scanner = new Scanner(System.in); double number = scanner.nextDouble(); StringBuilder stringBuilder = new StringBuilder("0." ); while (number > 0 ){ double r = number * 2 ; if (r >= 1 ){ stringBuilder.append("1" ); number = r - 1 ; }else { stringBuilder.append("0" ); number = r; } if (stringBuilder.length() > 34 ){ System.out.println("error" ); return ; } } System.out.println(stringBuilder); }
你知道的越多,你不知道的越多 嘿 我是小博 带你一起看我目之所及的世界……