1.組資料中只有乙個數字出現了一次。
其他所有數字都是成對出現的。請找出這個數字。
a ^ b ^ b = a
;
因為只有乙個數恰好出現乙個,剩下的都出現過兩次,所以只要將所有的數異或起來,就可以得到唯一的那個數。
#include
int find(char *str,int sz)
return tmp;
}int main(void)
;int sz = sizeof(arr)/sizeof(arr[0]);
int ret = find(arr,sz);
printf("%d\n",ret);
return
0;}
2,乙個陣列中只有兩個數字是出現一次,其他所有數字都出現了兩次。
找出這兩個數字.
有了第一題的基本的思路,我們可以將陣列分成兩個部分,每個部分裡只有乙個元素出現一次,其餘元素都出現兩次。那麼使用這種方法就可以找出這兩個元素了。 不妨假設出現乙個的兩個元素是x,y,那麼最終所有的元素異或的結果就是res = x^y。並且res!=0,那麼我們可以找出res二進位制表示中的某一位是1。對於原來的陣列,我們可以根據這個位置是不是1就可以將陣列分成兩個部分。x,y在不同的兩個子陣列中。而且對於其他成對出現的元素,要麼在x所在的那個陣列,要麼在y所在的那個陣列。
#include
int find(char * str,int sz,int
*x,int
*y) for(i = 0; i < 32; i++)
for(i = 0 ; i< sz; i++) }
*y = *x^tmp;
}int main(void)
;int sz = sizeof(arr)/sizeof(arr[0]);
find(arr,sz,&x,&y);
printf("%d\n%d\n",x,y);
return
0;
3.陣列中,只有乙個數出現一次,剩下都出現三次,找出出現一次的
因為數是出現三次的,也就是說,對於每乙個二進位制位,如果只出現一次的數在該二進位制位為1,那麼這個二進位制位在全部數字中出現次數無法被3整除。 膜3運算只有三種狀態:00,01,10,因此我們可以使用兩個位來表示當前位%3,對於每一位,我們讓two,one表示當前位的狀態,b表示輸入數字的對應位,two+和one+表示輸出狀態。
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 1 0
1 0 1 0 0
one+ =(one ^ b) & (~two)
two+ = (~one+) & (two ^ b)
這個問題大家可以思考一下,下次我再更新
python奇淫技巧
01 異常處理 02 python 中re模組的re.compile 方法 03 python中with的用法 04 pycharm使用git github的pull request流程 05 python的qrcode庫生成 圓角logo myqr庫生成動態 06 python包管理工具pipen...
奇淫技巧 長期更新
老版本的iis環境 index.asp data 可爆原始碼 phpstudy後門直接寫馬 space set o history 針對你的工作關閉歷史記錄,並且由於空格的緣故,該命令本身也不會被記錄 history grep keyword history d num 刪除指定歷史命令 num代表...
MTK除錯的奇淫技巧
mtk除錯的奇淫技巧 2012 4 12 18 02 不言而喻,無論是開發還是技術支援,與bug打交道在所難免。如果掌握了一些好的方法的話,可以起到事半功倍的效果。大致說來,mtk平台,無非是以下幾種方式加trace資訊 一 向串列埠輸出。優點,方便,快捷,缺點是列印太快,有些重要資訊不易獲取,不能...