日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法:异或运算

發布時間:2025/6/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法:异或运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

異或: 相同為0,不同為1.(也可以當作"無符號相加")

異或滿足交換律.

A ^ B ^ C ^ D = D ^ A ^ C ^ B

不用額外變量交換兩個數

public static void main(String[] args) {int a = 7;int b = 10;a = a ^ b;b = a ^ b;a = a ^ b;System.out.println(a);System.out.println(b);}

題目一: 一個數組中有一種數出現了奇數次,其他數都出現了偶數次,怎么找到并打印這種數.

public static void main(String[] args) {/** 一個數組中有一種數出現了奇數次,其他數都出現了偶數次,怎么找到并打印這種數*/int[] arr = {1,1,2,3,3,4,4,5,5};int num = 0;for (int i = 0; i < arr.length; i++) {num = arr[i]^num;}System.out.println(num);}

題目二: 取出一個整數中最右側的1

public static void main(String[] args) {// 2720(二進制形式:101010100000)int a = 2720;System.out.println(a & (-a));}

題目三:
一個數組中有兩種數出現了奇數次,其他數都出現了偶數次,怎么找到并打印這兩種數…
int[] arr = {1,1,2,2,2,3,3,4,4,4,4,5,6,6}; 2,5出現奇數次。

public static void printOddTimesNum2(int[] arr){int eor = 0;for (int i = 0; i < arr.length; i++) {eor ^= arr[i];}// eor = a ^ b// eor != 0// eor 必然有一個位置上是1int rightOne = eor & (~eor + 1); // 提取出最右的1int onlyOne = 0;for (int i = 0; i < arr.length; i++) {if((arr[i] & rightOne) != 0){// 數組中的數,同rightOne相與。如果不為0,就異或。這樣就能將數組中的數據分為兩部分。onlyOne ^= arr[i];}}System.out.println(onlyOne +" "+ (onlyOne^eor));}

題目四

import java.util.HashMap; import java.util.HashSet;public class CodeKM {public static void main(String[] args) {int kinds = 10;int range = 200; int testTime = 1; // 測試次數int max = 9;System.out.println("測試開始!");for (int i = 0; i < testTime; i++) {int a = (int)(Math.random() * max)+1; // 1~9int b = (int)(Math.random() * max)+1; // 1~9int k = Math.min(a,b);int m = Math.max(a,b);if(k == m){// 保證k一定小于mm++;}int[] arr = randomArray(kinds,range,k,m);int ans1 = test(arr, k,m);int ans2 = onlyKTimes(arr,k,m);if(ans1 != ans2){System.out.println("出錯了!");}}System.out.println("測試結束!");}public static int[] randomArray(int maxKinds, int range, int k, int m){int ktimeNum = randomNumber(range);int numKinds = (int)(Math.random()+maxKinds)+2;// k + (numKinds-1)*mint[] arr = new int[k + (numKinds-1)*m];int index = 0;for(;index<k;index++){arr[index] = ktimeNum;}numKinds--;HashSet<Integer> set = new HashSet<>();set.add(ktimeNum);while(numKinds!=0){int curNum = 0;do{curNum = randomNumber(range);}while(set.contains(curNum));set.add(curNum); // 將新生成的數保存在set集合中numKinds--;for (int i=0;i<m;i++){arr[index++] = curNum;}}for (int i = 0; i < arr.length; i++) {int j = (int)(Math.random()*arr.length);int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;//System.out.print(arr[i]+" ");}return arr;}public static int randomNumber(int range){return ((int)(Math.random()*range)+1)-((int)(Math.random()*range)+1);}public static int test(int[] arr, int k, int m){HashMap<Integer,Integer> map = new HashMap();for(int num : arr){if(map.containsKey(num)){map.put(num,map.get(num)+1);}else{map.put(num,1);}}for(int num : map.keySet()){if(map.get(num) == k){return num;}}return -1;}// 參數arr, 只有一種數出現了k次,其他數都出現了M次public static int onlyKTimes(int[] arr,int k,int m){int[] t = new int[32];/** t[0] 0位置的1出現了幾個* t[i] i位置的1出現了幾個*/for(int num : arr){// 只循環32次,所以時間復雜度還是 O(n)for (int i = 0; i < 32; i++) {if(((num >> i) & 1) != 0){// 表示num在第i位是1t[i]++;}}}int ans = 0;for (int i = 0; i < 32; i++) {if(t[i] %m != 0){// i位置上除以m,有余數,則表示i位置上有1ans |= (1<<i);}}return ans;} } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的数据结构与算法:异或运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。