???? 概述:數(shù)組中一個(gè)元素出現(xiàn)一次,其余元素出現(xiàn)兩次,找出這個(gè)元素。
???? 思路:遍歷數(shù)組中元素,依次使用異或運(yùn)算,得到的結(jié)果即為單一元素。因?yàn)閮蓚€(gè)相同元素相異或得到的結(jié)果為0,而非0元素異或上0得到的是本身。??
```
?int?singleNumber(vector<int>&?nums)?{
??????int?res=0;
??????for(int?i=0;i<nums.size();i++)??res^=nums[i];
??????return?res;
????}
```
面試題56 - II. 數(shù)組中數(shù)字出現(xiàn)的次數(shù) II
?概述:一個(gè)數(shù)組中除一個(gè)數(shù)字只出現(xiàn)一次之外,其他數(shù)字都出現(xiàn)了三次。找出只出現(xiàn)一次的數(shù)字。
思路:判斷每一位上1出現(xiàn)的次數(shù)cnt,如果是三的倍數(shù),則單一元素對應(yīng)位一定為0,否則為1;確定每一位后便得到該元素。
```
????int?singleNumber(vector<int>&?nums)?{
????????int?cnt,res=0;
?????????for(int?i=0;i<32;i++){
?????????????cnt=0;
?????????????int?h=1<<i;
?????????????for(int?j=0;j<nums.size();j++)?{
????????????????if(h&nums[j])?cnt++;
?????????????}
?????????????if(cnt%3!=0)??res+=1<<i;
?????????}
?????????return?res;
????????}
```
面試題56 - I. 數(shù)組中數(shù)字出現(xiàn)的次數(shù)
概述:一個(gè)數(shù)組里除兩個(gè)數(shù)字之外,其他數(shù)字都出現(xiàn)了兩次找出這兩個(gè)只出現(xiàn)一次的數(shù)字。
思路:我們需要把這兩個(gè)數(shù)分開,數(shù)組異或一遍得到num,num必定有一位為1,說明這兩個(gè)數(shù)在這一位上不相同,分別與每一個(gè)數(shù)字作異或,相同則第一組,不同的話就第二組,二者一定會(huì)被分開。
```
vector<int> singleNumbers(vector<int>& nums) {
? ? vector<int>res;
? ? int len=nums.size();
? ? if(!len)? return res;
? ? int a=0,b=0,num=0;
? ? for(int i=0;i<len;i++) num^=nums[i];
? ? int h=1;
? ? while((num&h)==0){
? ? ? ? h<<=1;
? ? }
? ? for(int i=0;i<len;i++){
? ? ? ? if(h&nums[i])
? ? ? ? ? ? a^=nums[i];
? ? ? ? else? b^=nums[i];
? ? }
? ? res.push_back(a);
? ? res.push_back(b);
? ? return res;
? ? }
```