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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

位运算-查找数组中唯一成对的数

發(fā)布時(shí)間:2023/11/29 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 位运算-查找数组中唯一成对的数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基礎(chǔ)實(shí)例一使用位運(yùn)算判斷數(shù)的奇偶性

  實(shí)例代碼:

public class Test {public static void main(String[] args) {System.out.println(isOdd(49));System.out.println(isOdd(50));}// 與運(yùn)算public static boolean isOdd(int i){return (i & 1) != 0; // 奇數(shù)最后一位二進(jìn)制為 1,偶數(shù)最后一位二進(jìn)制為 0} }

基礎(chǔ)實(shí)例二:位運(yùn)算判斷一個(gè)數(shù)轉(zhuǎn)為二進(jìn)制后的第i位數(shù)是0還是1

  實(shí)例代碼:

public class Test {public static void main(String[] args) {
        // 與運(yùn)算  int x = 85;System.out.println("x的第五位二進(jìn)制位的數(shù)為:" + ((((x&(1<<4))>>4)==1)?"1":"0"));// 比如85的二進(jìn)制為1010101,我們將它的二進(jìn)制與1向左移4位來做與運(yùn)算// 就是 1010101 & 0010000 得出結(jié)果0010000 再右移4位 即可得出結(jié)果} }

基礎(chǔ)實(shí)例三:位運(yùn)算交換兩個(gè)整數(shù)變量的值

  實(shí)例代碼:

public class Test {// 異或運(yùn)算public static void main(String args[]){int a=10;int b=20;a=a^b;b=b^a;a=a^b;System.out.println(a+"\t"+b);// 異或運(yùn)算性質(zhì) x ^ x ^ y == y,因?yàn)閤 ^ x == 0,0 ^ y == y} }

基礎(chǔ)實(shí)例四:使用位運(yùn)算,不用判斷語句,求整數(shù)的絕對(duì)值

  實(shí)例代碼: 

public class Test {// 異或運(yùn)算public static void main(String args[]){System.out.println(my_abs(-53));System.out.println(my_abs(53));}public static int my_abs(int a){/*** 對(duì)一個(gè)數(shù)進(jìn)行位運(yùn)算,是在這個(gè)數(shù)的補(bǔ)碼上運(yùn)行的* 正數(shù)的補(bǔ)碼是原碼,負(fù)數(shù)的補(bǔ)碼為原碼除了最高的符號(hào)為,取反,然后加一* int 型,先右移31位取符號(hào)位 如果a位正數(shù),i=0;a為負(fù)數(shù),i=-1* 一個(gè)數(shù)與-1即與0xFFFFFFFF異或就相當(dāng)與取反* 因此,a與i異或后再減i(因?yàn)閕為0或-1,所以減i即是要么加0要么加1)也可以得到絕對(duì)值*/int i = a >> 31;return ((a ^ i) -i);} }

異或運(yùn)算特點(diǎn):

  

題目一:找出唯一成對(duì)的數(shù)

  1-1000這1000個(gè)數(shù)放在含有1001個(gè)元素的數(shù)組中,只有唯一的一個(gè)元素值重復(fù),其他均只出現(xiàn)一次。每個(gè)數(shù)組元素只能訪問一次,設(shè)計(jì)一個(gè)算法,將它找出來;不用輔助存儲(chǔ)空間,能否設(shè)計(jì)一個(gè)算法實(shí)現(xiàn)?

  解題思路:這里使用的原理是連續(xù)的數(shù)字異或可以消除重復(fù),A ^ A=0,( A ^ A ) ^ B ^ ( C ^ C ) =B,但是我們的題目有兩個(gè)元素重復(fù),假如使用一次異或那么這個(gè)重復(fù)的元素就會(huì)被消掉了。所以這里有一個(gè)小技巧,就是使用兩次異或,先對(duì)不包含重復(fù)值數(shù)組進(jìn)行異或,在對(duì)包含重復(fù)值的數(shù)組進(jìn)行異或,這樣下來,就相當(dāng)于除了重復(fù)值每個(gè)值都異或了兩次,而重復(fù)的值異或了三次,這樣異或下來,就只剩一個(gè)重復(fù)的值了,就成功找出來了。為了方便測(cè)試,這里只使用了11個(gè)元素的數(shù)組,自行改成1001即可(示例代碼也給出了使用輔助存儲(chǔ)空間的解法)。這里有一個(gè)特殊的點(diǎn),就是這里給出了數(shù)組是1-1000連續(xù)的數(shù)并且只有唯一一個(gè)元素值重復(fù),所以才能構(gòu)造進(jìn)行異或兩次的解法。

  實(shí)例代碼:

import java.util.Random;public class 唯一成對(duì)的數(shù) {public static void main(String[] args) {int N = 11;int [] arr = new int[N];for (int i = 0; i < arr.length-1; i++) {arr[i] = i+1;}// 最后一個(gè)數(shù),是隨機(jī)數(shù)arr[arr.length-1] = new Random().nextInt(N-1)+1;// 隨機(jī)下標(biāo)int index = new Random().nextInt(N);swap(arr, index, arr.length-1);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+ " ");}System.out.println();int x1=0;for(int i=1;i <= N -1;i++){x1 = (x1^i); // 求得1到N-1這些連續(xù)的數(shù)的異或}for(int i=0;i < N ;i++){x1 = (x1^arr[i]); // 再與原來的數(shù)組arr異或,這樣重復(fù)的數(shù)就有三個(gè),不重復(fù)的數(shù)有兩個(gè),異或消除重復(fù)后,剩下的就是重復(fù)的數(shù)了}System.out.println(x1);System.out.println("使用輔助空間實(shí)現(xiàn)============");int []helper = new int[N];for (int i = 0; i < helper.length; i++) {helper[arr[i]]++;}for (int i = 0; i < helper.length; i++) {if (helper[i]==2) {System.out.println(i);break;}}}public static void swap(int[] array,int x,int y){int xx = array[x];int yy = array[y];array[x] = yy;array[y] = xx;}}

  運(yùn)行結(jié)果:

    

題目二:找出落單的那個(gè)數(shù)

  一個(gè)數(shù)組里除了某一個(gè)數(shù)字之外,其他的數(shù)字都出現(xiàn)了兩次。請(qǐng)寫出程序找出這個(gè)只出現(xiàn)一次的數(shù)字。

  解題思路:這個(gè)題目經(jīng)過上一個(gè)題目的學(xué)習(xí),就很簡單了,直接進(jìn)行異或即可。

  實(shí)例代碼:

public class Test {// 異或運(yùn)算public static void main(String args[]){int []a = {1,1,2,2,3,4,3};int x1 = 0;for (int i = 0; i < a.length; i++) {x1 = x1 ^ a[i];}System.out.println(x1);} }

  

?

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/xiaoyh/p/10247283.html

總結(jié)

以上是生活随笔為你收集整理的位运算-查找数组中唯一成对的数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。