【OJ】只出現一次的數字 小結

STL中sort函數實現原理

STL中sort根據不同的數量級別以及不同情況,結合了快速排序,推排序,插入排序,當數據量較大時採用快速排序,分段遞歸。一旦分段後的數據量小於某個閥值,爲避免遞歸調用帶來過大的額外負荷,便會改用插入排序。而如果遞歸層次過深,有出現最壞情況的傾向,還會改用堆排序。
參考:https://www.cnblogs.com/fengcc/p/5256337.html

【OJ】只出現一次的數字

  1. 在一個數組中除一個數字只出現一次之外,其他數字都出現了三次。請找出那個只出現一次的數字。
    思路:我們把數組中所有數字的二進制表示的每一位都加起來。如果某一位的和能被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;
    }
};
  1. 只出現一次的數字
    思路:根據異或運算的特點,相同的數字經過異或運算後結果爲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;
    }
};
  1. 一個整型數組裏除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。
    思路:先考慮一個數組裏只有一個數出現一次,其他兩個數都出現兩次的情況:一個數跟自己異或後爲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;
}();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章