劍指offer 第四十題方法總結

2022-04-08 21:18:54 字數 1558 閱讀 3696

題目:乙個陣列中只有兩個數字單獨出現,其餘數字都是成對出現的,請找出這兩個數。

看到這道題目大多數人第一時間想到的就是排序,排序完成後相鄰兩個數如果不同,則其中一定有乙個是我們要找的數,從這兩個數中間將陣列分成兩部分,分別異或得到的結果就是我們最終要求的兩個數。於是我們可以寫出下面這樣的**!!!  

#include

#include

int check(int arr, int len) //將arr中的陣列進行異或,然後將結果返回

return num;

}void bubble_sort(int arr, int len) //使用氣泡排序,對整個陣列進行公升序

} if (flag)

return; }}

void check_alone(int arr, int len, int *num1, int *num2) }}

int main()

; int num1 = 0;

int num2 = 0;

int len=sizeof(arr) / sizeof(arr[0]);

for (int i = 0; i <10; i++)

check_alone(arr,len, &num1, &num2);

printf("%d %d\n",num1,num2);

system("pause");

return 0;

}  這種方法也可以查詢n個單獨出現的數。  

好了,現在在加一些限制條件,要求時間複雜度為o(n),空間複雜度是o(1)。

這時我們就不能進行排序了,但是我們可以借助上面的思想,將整個陣列分成兩部分,每一部分各包含乙個單獨出現的數。然後再異或,就能得到結果。

那麼問題來了,該怎麼樣分組呢???

我們知道,如果兩個不相同的數相異或,則得到的結果一定不為0。既然不為0,那麼它的二進位制位中至少有一位為1。我們只需要找到乙個為1的bit位,然後將陣列中所有數,按照這一位為0還是為1分成兩組,這時就將陣列分成了兩部分。

#include

#include

int check(int arr,int len)

return num;

}void check_alone(int arr,int len, int *num1, int *num2)

while (len--) //按照這一位將陣列分成兩部分分別異或 }

int main()

; int num1 = 0;

int num2 = 0;

int len=sizeof(arr) / sizeof(arr[0]);

for (int i = 0; i <10; i++)

check_alone(arr,len, &num1, &num2);

printf("%d %d\n",num1,num2);

system("pause");

return 0;

}

解題思路 leetcode第四十題 組合總和

給定乙個陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的每個數字在每個組合中只能使用一次。說明 所有數字 包括目標數 都是正整數。解集不能包含重複的組合。示例 1 輸入 candidates 1...

劍指Offer第四十四題 翻轉單詞順序序列

牛客最近來了乙個新員工fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事cat對fish寫的內容頗感興趣,有一天他向fish借來翻看,但卻讀不懂它的意思。例如,student.a am i 後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是 i am a student....

100題 第四十題 百度研發筆試題

一,題目 1 設計乙個棧結構,滿足一下條件 min,push pop 操作的時間複雜度為 o 1 2 一串首尾相連的珠子 m個 有n種顏色 n 10 設計乙個演算法,取出其中一段,要求包含所有 n中顏色,並使長度最短。並分析時間複雜度與空間複雜度。3 設計乙個系統處理詞語搭配問題,比如說 中國和人民...