題目:乙個陣列中只有兩個數字單獨出現,其餘數字都是成對出現的,請找出這兩個數。
看到這道題目大多數人第一時間想到的就是排序,排序完成後相鄰兩個數如果不同,則其中一定有乙個是我們要找的數,從這兩個數中間將陣列分成兩部分,分別異或得到的結果就是我們最終要求的兩個數。於是我們可以寫出下面這樣的**!!!
#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 設計乙個系統處理詞語搭配問題,比如說 中國和人民...