leetcode636

leetcode 636

题目简介

计算一个函数的独占时间,可看到如下示例:
输入:
n = 2
logs =
[“0 : start : 0”,
“1 : start : 2”,
“1 : end : 5”,
“0 : end : 6”]
输出:[3, 4](PS:这里的空格都是没有的,不然到时候读取时会将空格读入)
说明:
函数 0 在时刻 0 开始,在执行了 2个时间单位结束于时刻 1。
现在函数 0 调用函数 1,函数 1 在时刻 2 开始,执行 4 个时间单位后结束于时刻 5。
函数 0 再次在时刻 6 开始执行,并在时刻 6 结束运行,从而执行了 1 个时间单位。
所以函数 0 总共的执行了 2 +1 =3 个时间单位,函数 1 总共执行了 4 个时间单位。

题目思想

我们需要做的有两点:(1)读入某个函数的开始时间(2)依次获取函数的状态
其实这题是非常适合栈的,毕竟一个函数是必须运行完了才能结束,而且不会有先开始先停止的问题出现,所以一旦开始一个新的函数就把他的id入栈,一旦他结束就出栈,可以说是为栈量身定做的了


(1)读入函数开始时间:由于在vector< string >中并没有split(切片)函数,于是我们需要自己做一个利用string可以直接在末尾添加值的特性输入的logs根据:(冒号)分成三段,第一、三段是开始的时刻,第二段表示此函数是开始还是结束
(2)依次获取函数的状态:由于这个是函数的独占时间,所以当A函数正在运行中时,B函数开始运行那么A函数的时间计算需要停止,那么我们需要用一个答案数组来存放每次函数状态变化的时间长短

AC代码

class Solution {
public:
    vector<string> split(const string& s, char sp) {
        vector<string> v;
        string t;
        for (auto c : s) {
            if (c == sp) {
                if (!t.empty()) {
                    v.push_back(t);
                    t.clear();
                }
            } else {
                t += c;
            }
        }
        if (!t.empty()) v.push_back(t);
        return v;
    }
    vector<int> exclusiveTime(int n, vector<string>& logs) {
        stack<int> st;
        vector<int> res(n, 0);
        int prev_t = -1;
        for (auto& s : logs) {
            auto items = split(s, ':');
            int id = stoi(items[0]);
            int t = stoi(items[2]);
            ++res[id];
            if (!st.empty() && prev_t != -1) {
                res[st.top()] += t - prev_t - 1;
            }
            if (items[1] == "start") {
                st.push(id);
            } else {
                st.pop();
            }
            prev_t = t;
        }
        return res;
    }
};

(PS:这是直接拉的题解,对于某些地方需要自己备注一下,毕竟对于方法知晓,但是实际实现终究还是还有一点差距,不知道用什么函数可以)

代码学习

stoi():参数为const string,目的是将数字字符串转化为int类型
还有一个与他相似的代码就是atoi(),参数类型为const char,作用是像数字字符转化为int类型


对于vector< string >其实和之前文章中的vector< int >相似,只是向搜索函数变成了find函数,用法相似(PS:本来想用这个的,因为find函数返回的是下标,但是这个里面有两个:(冒号)所以一时脑梗就觉得还是用string的末尾增加特性比较好)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值