圖森未來程式設計題-第一天
阿新 • • 發佈:2022-04-18
第一題
題目連結:https://leetcode-cn.com/problems/remove-element/
個人題解:因為要原地修改陣列,所以要雙指標。從前往後遍歷一遍即可
程式碼:
class Solution { public: int removeElement(vector<int>& nums, int val) { int k=0; for(int i=0;i<nums.size();i++) { if(nums[i]!=val) { nums[k++]=nums[i]; } } return k; } };
第二題
題目連結:https://leetcode-cn.com/problems/number-of-atoms/
借鑑一下大佬的思路:時間複雜度 \(O(nlogn)\)
- 不妨假設每個原子出現的次數不超過 32 位有符號整型的範圍。
- 維護一個棧,棧中存放二元組,表示原子的名稱和原子的數量。
- 掃描原分子式,如果遇到一個原子,則取出名稱和其對應的數量。如果遇到左括號,則左括號進棧。
- 如果遇到右括號,首先取出括號後數值,然後棧頂出棧直到遇到左括號。出棧後的二元組需要將對應位置上的值乘上括號後的數值,然後再次進棧。
- 最後需要將棧中所有原子出棧,並統計每個原子的出現次數,然後排序輸出。
程式碼:
typedef map<string, int> MPSI; class Solution { public: MPSI dfs(string& str, int& u) { MPSI res; while (u < str.size()) { if (str[u] == '(') { u ++ ; auto t = dfs(str, u); u ++ ; int cnt = 1, k = u; while (k < str.size() && isdigit(str[k])) k ++ ; if (k > u) { cnt = stoi(str.substr(u, k - u)); u = k; } for (auto& [x, y]: t) res[x] += y * cnt; } else if (str[u] == ')') break; else { int k = u + 1; while (k < str.size() && str[k] >= 'a' && str[k] <= 'z') k ++ ; auto key = str.substr(u, k - u); u = k; int cnt = 1; while (k < str.size() && isdigit(str[k])) k ++ ; if (k > u) { cnt = stoi(str.substr(u, k - u)); u = k; } res[key] += cnt; } } return res; } string countOfAtoms(string formula) { int k = 0; auto t = dfs(formula, k); string res; for (auto& [x, y]: t) { res += x; if (y > 1) res += to_string(y); } return res; } };