成都东软学院新生周赛(五)
成都東軟學(xué)院新生周賽(五)
感受
這次比賽打的非常艱辛,全程1.20小時(shí)的時(shí)間全在寫A題,而且還沒有寫出來。還是自己太菜了。比賽過程中根本就沒有想到用位運(yùn)算去寫著三個(gè)題。
考點(diǎn)
位運(yùn)算:位運(yùn)算是二進(jìn)制下的運(yùn)算,運(yùn)算速度最快,運(yùn)算級(jí)別最低.
| C符號(hào) | & | | | ^ | ~ | << | >> |
| 規(guī)則 | 兩個(gè)二進(jìn)制為都為1,則二進(jìn)制位的結(jié)果為1,否則為0. | 兩個(gè)二進(jìn)制位只要有一個(gè)為1,則二進(jìn)制位的結(jié)果為1 | 若兩個(gè)二進(jìn)制位的值相同為0,不同為1 | 對(duì)二進(jìn)制數(shù)按位取反,將0變1 | 將一個(gè)數(shù)的二進(jìn)制數(shù)全部左移N位,右補(bǔ)0 | 將一個(gè)數(shù)的二進(jìn)制數(shù)全部右移N位,移到右端的低位被舍棄,對(duì)于無符號(hào)數(shù),高位補(bǔ)0 |
- C語言中數(shù)都是以補(bǔ)碼的形式存在的,所以取反的時(shí)候要注意這一點(diǎn)(正負(fù)數(shù)的考慮).
A:找出數(shù)組中唯一只出現(xiàn)過一次的數(shù),別個(gè)數(shù)都出現(xiàn)兩次。
在做這個(gè)題的時(shí)候,根本就沒有想到位運(yùn)算,所以我就把我能用的方法都試了一下,map,排序,暴力。發(fā)現(xiàn)都不行。賽后問他們發(fā)現(xiàn)這題太水了,一個(gè)異或就可以解決的事情。
我們知道異或可以理解為不進(jìn)位的加法(兩個(gè)數(shù)相加最高位不會(huì)改變).但這題關(guān)鍵和不進(jìn)位沒有關(guān)系.我們可以發(fā)現(xiàn)兩個(gè)相同的數(shù)互相異或的值為0,我們是不是可以把數(shù)組中的每個(gè)數(shù)都異或一次,最后的結(jié)果就是我們要的到的數(shù).
B:找出數(shù)組中兩個(gè)只出現(xiàn)過一次的數(shù),別個(gè)數(shù)都出現(xiàn)兩次
這個(gè)題和上個(gè)題很像,是異或的進(jìn)擊版.還是和上面一樣,但是這次我們的出來的值ans = a^b.顯然我們要在這里面得出答案.最后的答案肯定不是0,根據(jù)異或的定義,可以知道兩個(gè)數(shù)二進(jìn)制位不同為1,我們把這一位找出來輔助為flag,然后運(yùn)用位運(yùn)算且,循環(huán)遍歷整個(gè)數(shù)組,把每個(gè)數(shù)與flag比較,如果為真,則用a異或,否則用b異或,這樣就可以把兩個(gè)數(shù)獨(dú)立出來.
C:找出數(shù)組中唯一只出現(xiàn)過一次的數(shù),別個(gè)數(shù)都出現(xiàn)三次(數(shù)組大小為3*N+1)
這個(gè)題就不好直接的用異或,但是可以借用上面的思想,由于不知道數(shù)據(jù)的大小,就當(dāng)成64位的long long來算,我們開始一個(gè)大小為65的數(shù)組,我們用這個(gè)數(shù)組來模擬二進(jìn)制.
將每個(gè)數(shù)都轉(zhuǎn)換成二進(jìn)制,并存入數(shù)組中,最后我們就得到所有數(shù)的二進(jìn)制情況.我們只需要遍歷這個(gè)數(shù)組,把每一位對(duì)3取余,如果不為0,則把這一位轉(zhuǎn)換成10進(jìn)制存入ans中.
感想
昨天晚上看到題解補(bǔ)完題后,只能說這次不應(yīng)該報(bào)零.還是自己的實(shí)力不夠,有人AK,有人報(bào)零.最近狀態(tài)一直不在,是要找個(gè)時(shí)間好好的調(diào)整一下了.
總結(jié)
以上是生活随笔為你收集整理的成都东软学院新生周赛(五)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java大数一些个人的见解
- 下一篇: 又爱又恨的STL