只出現過一次的數字(簡單)
136. 只出現一次的數字 - 力扣(LeetCode)
這道題使用異或就非常簡單了,所有數異或到一起,相同的數據雙雙消除,只剩下一個的數。
C語言異或運算詳解-CSDN博客
class Solution {
public:int singleNumber(vector<int>& nums) {int val = 0;for(auto e : nums){val ^= e;}return val;}
};
變形題:(簡單)
137. 只出現一次的數字 II - 力扣(LeetCode)
思路:統計出32個位中,每個位合計起來1出現的次數。
每個位1的個數要么是3n,要么是3n+1。而 3n+1 的位就是只出現一次的數的位
class Solution {
public:int singleNumber(vector<int>& nums) {// 統計32個位合計1的個數int bitArray[32] = {0};for(auto e : nums){for(size_t i = 0; i < 32; ++i){if(e & (1 << i)){bitArray[i]++;}}}int num = 0;// 找出3n+1的位,這些位就是只出現1次的數為1的位for(size_t i = 0; i<32; ++i){// 將3n+1的位或成1if(bitArray[i] % 3 == 1){num |= (1 << i);}}return num;}};
變形題:(中等)
??????260. 只出現一次的數字 III - 力扣(LeetCode)
class Solution {
public:vector<int> singleNumber(vector<int>& nums) {// 異或完成后,val就是只出現一次的兩個數據異或的結果int val = 0;for(auto e : nums){val ^= e;}/* 解題思路 */// 此時的val就是兩個我們要找的數據異或的結果,val中為1的位就是兩個數不同的位// 即這個位有一個數為0有一個數為1// 此時我們將所有數據分為兩組,一組是這個位為0的數,一組是這個位為1的數// 此時兩個只出現過一次的數會被分到兩個組中// 而其他的出現過兩次的數也會被分過去,此時的問題就變成了問題1:// 一個整數數組中有1個只出現過1次的數,其他數都出現兩次,找出這個只出現1次的數// 此時再按照問題1處理兩組數據// 將一組中所有的數異或到一起,此時的異或結果就是這組數據中只出現過一次的數據。/* end */// 找到val中為1的位,并以此為依據將原數組分成兩組數組size_t i = 0;for(; i <32 ; ++i){if(val & (1 << i))break;}// 將第i位為0和為1的分開成兩組進行異或,得到的num1和num2就是兩個只出現過一次的數int num1 = 0, num2 = 0;for(auto e : nums){if(e & (1 << i))num1 ^= e;elsenum2 ^= e;}vector<int> v;v.push_back(num1);v.push_back(num2);return v;}
};
楊輝三角(簡單)
118. 楊輝三角 - 力扣(LeetCode)
class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> vv;vv.resize(numRows);// 構建初始的楊輝三角,每行開頭和結尾賦值為1for(size_t i = 0;i<numRows;++i){vv[i].resize(i+1);vv[i][0] = 1;vv[i][vv[i].size() - 1] = 1;}// 填充楊輝三角for(size_t i = 0;i<vv.size();++i){for(size_t j = 0;j<vv[i].size();++j){// 不為1的需要被填充if(vv[i][j] != 1){vv[i][j] = vv[i-1][j-1] + vv[i-1][j];}}}return vv;}
};