classSolution{public:// 方法一:有限狀態自動機DFA,時間復雜度 O(N)typedef pair<char,int> charint;typedef unordered_map<char,int> unmap;boolisNumber(string s){vector<unmap> states ={unmap{charint(' ',0),charint('s',1),charint('d',2),charint('.',4)},unmap{charint('d',2),charint('.',4)},unmap{charint('d',2),charint('.',3),charint('e',5),charint(' ',8)},unmap{charint('d',3),charint('e',5),charint(' ',8)},unmap{charint('d',3)},unmap{charint('s',6),charint('d',7)},unmap{charint('d',7)},unmap{charint('d',7),charint(' ',8)},unmap{charint(' ',8)}};int p =0;char t;for(char c:s){if(c >='0'&& c <='9')t ='d';elseif(c =='+'|| c =='-')t ='s';elseif(c =='e'|| c =='E')t ='e';elseif(c =='.'|| c ==' ')t = c;elset ='?';if(!states[p].count(t))returnfalse;p =(int) states[p][t];}return p ==2|| p ==3|| p ==7|| p ==8;}};
classSolution{public:vector<int>singleNumbers(vector<int>& nums){int ret =0;for(int n : nums)ret ^= n;int div =1;while((div & ret)==0)div <<=1;int a =0, b =0;for(int n : nums)if(div & n)a ^= n;elseb ^= n;return vector<int>{a, b};}};
9 和為s的兩個數字
解法1雙指針法 時間復雜度 N 空間復雜度1 解法2二分查找法 時間復雜度 N*log(N2) 空間復雜度1 解法3哈希散列表法 時間復雜度N,空間復雜度N
classSolution{public:intsingleNumber(vector<int>& nums){int counts[32]={0};for(auto num : nums){for(int i =0; i <32; i++){counts[i]+= num &1;num = num >>1;}}int res =0;int m =3;for(int j =0; j <32; j++){res = res <<1;res = res |(counts[31- j]% m);}return res;}};
11 1~n 整數中 1 出現的次數
解題思路 每次將一個位置固定為1計算有多少這樣的數字
classSolution{public:intcountDigitOne(int n){longlong digit =1;longlong cur = n / digit -10*(n/(digit*10));longlong low = n % digit;longlong high = n /(digit *10);longlong res =0;if(cur ==0){res += high * digit;}elseif(cur ==1){res += high * digit + low +1;}else{res += high * digit + digit;}while(high >0){digit *=10;cur = n / digit -10*(n /(digit *10));low = n % digit;high = n /(digit *10);if(cur ==0){res += high * digit;}elseif(cur ==1){res += high * digit + low +1;}else{res += high * digit + digit;}}return res;}};
12 和為s的連續正數序列
解題思路 利用滑動窗口的思路解題
classSolution{public:vector<vector<int>>findContinuousSequence(int target){int i =1, j =2, s =3;vector<vector<int>> res;while(i < j){if(s == target){vector<int> ans;for(int k = i; k <= j; k++)ans.push_back(k);res.push_back(std::move(ans));}if(s >= target){s -= i;i++;}else{j++;s += j;}if(j >(target /2+1)){break;}}return std::move(res);}};