图森未来编程题-第一天
第一题
题目链接: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;
}
};

浙公网安备 33010602011771号