1. 程式人生 > 其它 >圖森未來程式設計題-第一天

圖森未來程式設計題-第一天

第一題

題目連結: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)\)

  1. 不妨假設每個原子出現的次數不超過 32 位有符號整型的範圍。
  2. 維護一個棧,棧中存放二元組,表示原子的名稱和原子的數量。
  3. 掃描原分子式,如果遇到一個原子,則取出名稱和其對應的數量。如果遇到左括號,則左括號進棧。
  4. 如果遇到右括號,首先取出括號後數值,然後棧頂出棧直到遇到左括號。出棧後的二元組需要將對應位置上的值乘上括號後的數值,然後再次進棧。
  5. 最後需要將棧中所有原子出棧,並統計每個原子的出現次數,然後排序輸出。

程式碼:

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;
    }
};