湖南網(wǎng)絡(luò)公司網(wǎng)站建設(shè)seo教學(xué)平臺(tái)
不愛生姜不吃醋??????
🌻如果本文有什么錯(cuò)誤的話歡迎在評論區(qū)中指正哦💗
🌻看完之后覺得不錯(cuò)的話麻煩動(dòng)動(dòng)小手點(diǎn)個(gè)贊贊吧👍
🌻與其明天開始,不如現(xiàn)在行動(dòng)!💪
🌻大家的支持就是我最大的動(dòng)力!沖啊!🌹🌹🌹
文章目錄
- 🌴面試題
- 🌴分析
- 🌴代碼編寫
- 第一問
- 第二問
- 🌴總結(jié)
🌴面試題
(1)在一個(gè)數(shù)組中,有一個(gè)數(shù)出現(xiàn)了奇數(shù)次,其余數(shù)都出現(xiàn)了偶數(shù)次,求出這個(gè)數(shù)
(2)如果數(shù)組中有兩個(gè)數(shù)出現(xiàn)了奇數(shù)次,求這兩個(gè)數(shù)
🌴分析
這是一道經(jīng)典的關(guān)于位運(yùn)算的面試題,使用異或^
來解題。
異或相當(dāng)于是不進(jìn)位的二進(jìn)制加法,其相關(guān)運(yùn)算:
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 0 = 0
除此之外,異或運(yùn)算的兩個(gè)性質(zhì):交換律和結(jié)合律
a ^ b = b ^ a
a ^ b ^ c = a ^ c ^ b
了解相關(guān)概念之后,對于面試題的第一問:
把數(shù)組中的所有數(shù)字異或運(yùn)算,相同的兩個(gè)數(shù)字異或之后會(huì)等于
0
,那么再與剩余的奇數(shù)個(gè)的數(shù)字異或就會(huì)等于我們要的這個(gè)數(shù)字
對于第二問,我們分成三部分來解決:
假如數(shù)組中奇數(shù)個(gè)的數(shù)字分別是
a
和b
,那么按照第一問的方法,異或數(shù)組中的所有數(shù)字,最后的得到的結(jié)果就是a^b
,用num1
來表示
之后我們求出
num1
的二進(jìn)制中只保留最右邊的1
的數(shù),用num2
來表示(例:num1=1010
,那么num2=0010
,下面的分析也是以這兩個(gè)數(shù)來說明),讓num2
來異或所有在二進(jìn)制數(shù)中第二位不等于1
的數(shù)(例:x=0010,y=1100
,那么就要用num2
異或y
)最終會(huì)得到a和b這倆個(gè)數(shù)其中的一個(gè)
假設(shè)我們得到了
a
,那么只需要用a
異或num1
就會(huì)得到b
多說無益,那我們就開始編寫代碼吧!
🌴代碼編寫
第一問
public class Test2 {public static void main(String[] args) {//定義數(shù)組,其中2出現(xiàn)了三次,其余數(shù)字都出現(xiàn)了偶數(shù)次int[] arr = {1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5};int num=0;for (int i : arr) {num ^= i;}System.out.println(num);}
}
運(yùn)行代碼之后我們得到數(shù)字2
。
第二問
public class Test {public static void main(String[] args) {//定義數(shù)組,其中2出現(xiàn)了三次,5出現(xiàn)了一次,其余數(shù)字都出現(xiàn)了偶數(shù)次int[] arr = {1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5};int num1 = 0;for (int i : arr) {num1 ^= i;}int rightOne = num1 & (~num1 + 1);int num2 = 0;for (int i : arr) {if ((rightOne & i) == 0) {num2 ^= i;}}int a = num2;int b = a ^ num1;System.out.println(a + "," + b);}
}
運(yùn)行代碼之后我們得到數(shù)字2,5
。
🌴總結(jié)
文章中代碼的編寫使用的都是Java基礎(chǔ)知識(shí),其中關(guān)于異或的運(yùn)算要多加練習(xí)熟能生巧。
本文中若是有出現(xiàn)的錯(cuò)誤請?jiān)谠u論區(qū)或者私信指出,我再進(jìn)行改正優(yōu)化,如果文章對你有所幫助,請給博主一個(gè)寶貴的三連,感謝大家😘!!!