日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode :string字符串和数字

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode :string字符串和数字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 01 第一個只出現一次的字符
      • 02 左旋轉字符串
      • 03 字符串的排列
      • 04表示數值的字符串
      • 05把數字翻譯成字符串
      • 06 最長不含重復字符的子字符串
      • 07 0~n-1中缺失的數字
      • 08 數組中數字出現的次數
      • 9 和為s的兩個數字
      • 10 數組中數字出現的次數 II
      • 11 1~n 整數中 1 出現的次數
      • 12 和為s的連續正數序列
      • 13翻轉單詞順序
      • 14不用加減乘除做加法

01 第一個只出現一次的字符

在字符串 s 中找出第一個只出現一次的字符。如果沒有,返回一個單空格。 s 只包含小寫字母。

示例:

s = “abaccdeff”
返回 “b”

s = “”
返回 " "
解題思路:
用map保存字符出現的次數,用for(char c:s)來遍歷字符串

class Solution { public: //方法一: 用一個map記錄字母出現的次數就可以了char firstUniqChar(string s) {map<char,bool> memberChartimes;for(char c:s){memberChartimes[c] = (memberChartimes.find(c) == memberChartimes.end());} for(char c:s){if(memberChartimes[c] == true)return c;}return ' ';} };

02 左旋轉字符串


**解法1:**利用substring 直接切片 ,通過是喲個std::move可以節省空間,
解法2 一個一個字母轉換

class Solution { public:string reverseLeftWords(string s, int n) {string str = std::move(s.substr(0, n));s.erase(s.begin(), s.begin() + n);s += std::move(str);return std::move(s); } }; class Solution { public: string reverseLeftWords(string s, int n) {for (int i = 0; i < n; i++){char ch = s[0];s.erase(0, 1);s.push_back(ch);}return s; } };

03 字符串的排列


解法

class Solution { public:vector<string> permutation(string s) {DFS(s,0);return res;}void DFS(string s,int k){if(k == s.size() - 1){res.push_back(std::move(s));}set<int> st;for(int i = k;i < s.size();i++){if(st.find(s[i]) != st.end()) continue;st.insert(s[i]);swap(s[k],s[i]);DFS(s,k+1);swap(s[i],s[k]);}} private:vector<string> res; };

04表示數值的字符串


解題思路 狀態機

class Solution { public:// 方法一:有限狀態自動機DFA,時間復雜度 O(N)typedef pair<char,int> charint;typedef unordered_map<char,int> unmap;bool isNumber(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';else if(c == '+' || c == '-')t = 's';else if(c == 'e' || c == 'E')t = 'e';else if(c == '.' || c == ' ')t = c;elset = '?';if(!states[p].count(t))return false;p = (int) states[p][t];}return p == 2 || p == 3 || p == 7 || p == 8;} };

05把數字翻譯成字符串


解法 青蛙跳臺問題變種,遞歸或者while循環

class Solution { public:int translateNum(int num) {string str = std::to_string(num);DFS(str, 0);return numRes;}void DFS(string& s, int k){if (k == s.size()){numRes++;return;}DFS(s, k + 1);if ((k + 1) < s.size()){if(s[k] != '0'){string temp;temp.push_back(s[k]);temp.push_back(s[k + 1]);int value = std::stoi(temp);if (value <= 25){DFS(s, k + 2);}} }} private:int numRes = 0; }; class Solution { public:int translateNum(int num) {string s = std::to_string(num);if (s.size() == 0){return 0;}if (s.size() == 1){return 1;}int num1 = 1;int num2 = 1;if (('0' < s[0]) & ('3' > s[0])){if (s[0] == '2'){if (s[1] < '6'){num2 = 2;}}else{num2 = 2;}}int i = 2;while (i < s.size()){if (('0' < s[i - 1]) & ('3' > s[i - 1])){if (s[i - 1] == '2'){if (s[i] < '6'){num2 = num1 + num2;num1 = num2 - num1;}else{num1 = num2;}}else{num2 = num1 + num2;num1 = num2 - num1;}}else{num1 = num2;}i++;}return num2;} };

06 最長不含重復字符的子字符串


解題思路動態規劃 + 雙游標

class Solution { public:int lengthOfLongestSubstring(string s) {if(s.size() == 1){return 1;}int maxLength = 0;int begin = 0;for (int i = 1; i < s.size(); i++){int a = findSameChar(s, begin, i - 1, s[i]);if (a != begin){begin = a;}if (maxLength < (i - begin+1)){maxLength = (i - begin+1);}}return maxLength;}int findSameChar(string& s, int begin, int end, char a){int samePos = end+1;for (int i = begin; i <= end; i++){if (s[i] == a){samePos = i;}}if (samePos != (end+1)){begin = samePos+1;}return begin;} };

07 0~n-1中缺失的數字


解題思路

class Solution { public:int missingNumber(vector<int>& nums) {int low = 0;int high = nums.size() - 1;int mid = (low + high) / 2;while (true){if ((high <= low)){if (nums[mid] == mid){return nums[mid] + 1;}else{return nums[mid] - 1;}}if (nums[mid] > mid){high = mid - 1;mid = (low + high) / 2;}else{low = mid + 1;mid = (low + high) / 2;}}return 0;} };

08 數組中數字出現的次數


解題思路用好異或

class Solution { 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

class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> res;int start = 0;int end = nums.size() - 1;while (true){if ((nums[start] + nums[end]) > target){end--;}else if ((nums[start] + nums[end]) < target){start++;}else{res.push_back(nums[start]);res.push_back(nums[end]);break;}}return res;}}; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int endPos = LowBs(nums, 0, nums.size() - 1, target);vector<int> res;for (int i = endPos; i >= 0; i--){int leftValue = target - nums[i];int firstPos = 0;if (BS(nums, 0, i, leftValue, firstPos)){res.push_back(nums[i]);res.push_back(nums[firstPos]);return res;}}return res;}int LowBs(vector<int>& nums, int start, int endj, int target){int mid = (start + endj) / 2 ;while (true){if (endj <= start){if (nums[mid] < target){return mid;}else{return mid - 1;}}if (nums[mid] >= target){endj = mid - 1;mid = (start + endj) / 2;}else{start = mid + 1;mid = (start + endj) / 2;}}}bool BS(vector<int>& nums, int start, int endj, int target, int& res){int mid = (start + endj) / 2;while (true){if (endj <= start){return false;}if (nums[mid] > target){endj = mid - 1;mid = (start + endj) / 2;}else if(nums[mid] < target){start = mid + 1;mid = (start + endj) / 2;}if(nums[mid] == target){res = mid;return true;}}} };

10 數組中數字出現的次數 II


解題思路 利用好位運算

class Solution { public:int singleNumber(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計算有多少這樣的數字

class Solution { public:int countDigitOne(int n) {long long digit = 1;long long cur = n / digit - 10*(n/ (digit*10));long long low = n % digit;long long high = n / (digit * 10);long long res = 0;if (cur == 0){res += high * digit;}else if (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;}else if (cur == 1){res += high * digit + low + 1;}else{res += high * digit + digit;}}return res;} };

12 和為s的連續正數序列


解題思路 利用滑動窗口的思路解題

class Solution { 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);} };

13翻轉單詞順序


解題思路 雙指針 或者遍歷 時間復雜度N,空間復雜度N

class Solution { public:string reverseWords(string s) {string res;string::reverse_iterator rIterend = s.rbegin();string::reverse_iterator rIterBegin = s.rbegin();while (rIterend != s.rend()){if ((*rIterend) == ' '){rIterend++;rIterBegin = rIterend;continue;}else{rIterBegin++;}if ( ( rIterBegin == s.rend()) || (*rIterBegin == ' ')){string::reverse_iterator temp = rIterBegin;while (true){temp--;res.push_back(*temp);if ((temp - rIterend) == 0){break;}}res.push_back(' ');rIterend = rIterBegin;}}res.pop_back();return res;} }; class Solution { public:string reverseWords(string s) {string res;string temp = " ";string::reverse_iterator rIter = s.rbegin();while (rIter != s.rend()){if ((*rIter == ' ')){if (temp.size() != 1){addTempString(res, temp);temp.clear();temp = " ";}rIter++;}else{temp.push_back(*rIter);rIter++;}}if (temp.size() != 1){addTempString(res, temp);temp.clear();temp = " ";}res.pop_back(); //去掉最后一個空符號return res;}void addTempString(string& s, string& temp){string::reverse_iterator rIter = temp.rbegin();while (rIter != temp.rend()){s.push_back(*rIter);rIter++;}} };

14不用加減乘除做加法


class Solution { public:int add(int a, int b) { //因為不允許用+號,所以求出異或部分和進位部分依然不能用+ 號,所以只能循環到沒有進位為止 while(b!=0){ //保存進位值,下次循環用int c=(unsigned int)(a&b)<<1;//C++中負數不支持左移位,因為結果是不定的 //保存不進位值,下次循環用,a^=b; //如果還有進位,再循環,如果沒有,則直接輸出沒有進位部分即可。b=c; }return a;} };

總結

以上是生活随笔為你收集整理的leetcode :string字符串和数字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。