STL中sort函數實現原理
STL中sort根據不同的數量級別以及不同情況,結合了快速排序,推排序,插入排序,當數據量較大時採用快速排序,分段遞歸。一旦分段後的數據量小於某個閥值,爲避免遞歸調用帶來過大的額外負荷,便會改用插入排序。而如果遞歸層次過深,有出現最壞情況的傾向,還會改用堆排序。
參考:https://www.cnblogs.com/fengcc/p/5256337.html
【OJ】只出現一次的數字
- 在一個數組中除一個數字只出現一次之外,其他數字都出現了三次。請找出那個只出現一次的數字。
思路:我們把數組中所有數字的二進制表示的每一位都加起來。如果某一位的和能被3整除,那麼那個只出現一次的數字二進制表示中對應的那一位是0;否則就是1。https://blog.csdn.net/qq_23084001/article/details/79250637
class Solution {
public:
int singleNumber(vector<int>& nums) {
int x = 0, bitSum[32];
memset(bitSum,0,sizeof(bitSum));
for(int i : nums){
bitSum[0] += (i&1);
for(int j = 1; j < 32; j++){
bitSum[j] += (i >> j & 1);
}
}
int r;
for(int i = 31; i >= 0; i--){
if(bitSum[i] % 3 == 0) r <<= 1;
else r = (r << 1) + 1;
}
return r;
}
};
- 只出現一次的數字
思路:根據異或運算的特點,相同的數字經過異或運算後結果爲0,除單獨出現一次的數字外,其他數字都是出現兩次的,那麼這些數字經過異或運算後結果一定是0。而任何數字與0進行異或運算都是該數字本身。所以對數組所有元素進行異或運算,運算結果就是題目的答案。https://www.cnblogs.com/zfLee/p/9330127.html
class Solution {
public:
int singleNumber(vector<int>& nums) {
int x = 0;
for(int i : nums){
x ^= i;
}
return x;
}
};
- 一個整型數組裏除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。
思路:先考慮一個數組裏只有一個數出現一次,其他兩個數都出現兩次的情況:一個數跟自己異或後爲0,一個數組裏只有一個數出現一次其他兩次,挨個異或後最後得到的結果就是隻出現一次的那個數。然後我們把這個數組分爲兩部分,每部分只有一個數只出現一次:我們分的時候,把所有數都異或後,得到的結果肯定不爲0,其實是那兩個只出現一次的不同的數的異或,我們從低位到高位找到第一個不爲0的那位,異或後這兩個數的這位上肯定是一個爲1一個爲0,所以我們根據這位將整個數組分爲兩部分,這位上爲1的和這位上爲0的,這樣就保證這兩個只出現一次的數會被分到兩個部分中,然後每部分按只有一個只出現一次的方法解決即可。
https://www.cnblogs.com/rosending/p/5668047.html
法一:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
vector<int> v;
int x = nums[0];
for (int i = 1; i < nums.size(); i++) {
x ^= nums[i];
}
int bit = 0;
while ((x & 1) == 0) {
x >>= 1;
bit++;
}
v.push_back(0);
v.push_back(0);
for (int i = 0; i < nums.size(); i++) {
if ((nums[i] >> bit & 1 )== 0) {
v[0] ^= nums[i];
}
else {
v[1] ^= nums[i];
}
}
return v;
}
};
法二:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
vector<int>res;
int x = 0,res1=0,res2=0;
for (int num : nums) x ^= num;
x &= -x;
for (int num : nums)
{
if (x&num)res1 ^= num;
else res2 ^= num;
}
res.push_back(res1);
res.push_back(res2);
return res;
}
};
萬能句式:
static const auto _=[]() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();