演算法中的奇技淫巧

2021-09-24 09:52:05 字數 1369 閱讀 7166

1. 乙個陣列中,只有乙個數隻出現了一次,其他的都出現了兩次,找出只出現了一次的數,比如 [1,2,3,4,5,4,3,2,1],其中,沒有重複的就是5

看到這種題,大概第乙個想法是利用hash表吧,每次儲存時,記錄次數,最後再遍歷看看誰只出現了一次。

然鵝,我看到有一種演算法,真真真真真是太簡單了

我們都學過位運算吧,那麼,異或運算就是解題的關鍵咯!!!我們都知道異或運算中,如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同,異或結果為0。0異或所有的數都等於那個數的本身。再根據結合律和交換律本題是不是就得解啦:

1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 = (1 ^ 1) ^ (2 ^ 2) ^ (3 ^ 3) ^ (4 ^ 4) ^ 5 = 0 ^ 0 ^ 0 ^ 0 ^ 5 = 5

int a = ;

int temp = a[0];

for (int i = 1; i < a.length; i++)

system.out.println("the result is " + temp);

是不是簡單明瞭!!!!而且它的複雜度是o(1)。

那麼我們來提高一下下,請聽題:

已知有乙個大小為11的陣列,裡面裝有1-10的數,其中只有乙個重複,其它的數字只出現了一次,那麼怎麼找到這個數呢???

在這個陣列裡面肯定有1-10這10個數,剩下乙個數也在這裡面,假如1-10這十個數異或出來是n,設我們要求的數為n,那麼,最終這11個數異或的結果為n ^ n。

已知:1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ^ 8 ^ 9 ^ 10 = n

則: 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ^ 8 ^ 9 ^ 10 ^ n = n ^ n

那麼,只需要把11個數異或之後的結果(n ^ n)再去和1-10異或之後的結果(n)相異或,即 n ^ n ^ n = n

在不使用中間變數的情況下交換兩個數?

在交換兩個數的問題上,一般只想得到通過乙個中間變數,比如:

int temp = x;

x = y;

y=temp

我們學習了異或之後,就有了新的解題方法!

x = x ^ y;

y = x ^ y;

x = x ^ y;

第二步我們可以解讀成(x ^ y) ^ y = x。同理第三步為(x ^ y) ^ x = y

異或操作是不是超級厲害,咩哈哈哈哈哈!!!!!!!!!!!!

2019.6.13更

git 奇技淫巧

例如 1.0.0 git tag a 1.0.0 m 1.0.0 版本的備註資訊.複製 git push origin tags 複製 例如 1.0.0 git tag d 1.0.0 複製 刪除遠端標籤需要先刪除本地標籤,再執行下面的命令 git push origin refs tags 1.0...

c 的奇技淫巧

關於陣列 數論演算法技巧 stl其他 while scanf d d n,m eof 等價於 while scanf d d n,m 2 前者eof為檔案結束符,較保險 後者 後的數字為輸入的變數的個數 不能只寫while scanf d d n,m 這樣無法結束讀入 wwq大佬教的,希望我不要和他...

Git的奇技淫巧

git常用命令集合,fork於tips專案 git是乙個 分布式版本管理工具 簡單的理解版本管理工具 大家在寫東西的時候都用過 回撤 這個功能,但是回撤只能回撤幾步,假如想要找回我三天之前的修改,光用 回撤 是找不回來的。而 版本管理工具 能記錄每次的修改,只要提交到版本倉庫,你就可以找到之前任何時...