2022-10-21-安贤量化-1h-量化工程师

正式入职的也需要先实习3个月,可以不用考虑了

力扣周赛内推的

实现一个python里的字典

1.要求

  • 定义 SlashDict class,当key中包含斜杠(/)时,把相应的元素视作递归的字典把key按/分割后逐级查询
  • 该 class 需至少支持 dict的get,pop方法以及插入操作。(如用python作答,该class 行为需要尽可能接近系统内置dict)
  • dict插入key时若包含/,则逐级创建字典并插入相应的key/value
    ·定义deep keys()方法,返回的 key所对应的value 如包含dict,则递归获取它的key直到到最后一级,中间各级的key用/连接

2.示例

>>> sd = SlashDict({'a': {'b': {'c': {'x': 1. 'y': 2}},'d': 3},'e

>>> sd['a/b/c']
SlashDict({'x': 1, 'y': 2})>>> sd['a/b/d']
3
>>> sd['a/b/k']
KeyError: Dict under key 'a/b' does not have key 'k'
>>> sd.pop('a/b/c/y')
2
>>> sd['e/f/g'] = 5>>> sd
SlashDict({'a': {'b': {'c': {'x': 1}},'d': 3},'e': {'f':{'g': 5}}
>>> list(sd.deep_keys(())
['a/b/c/x','a/b/d', 'e/f/g']
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <exception>
#include <functional>
class SlashDict
{
    std::map<std::string, SlashDict> dic;
    int value;
public:
    SlashDict():value(-1){}

    int getValue(){return value;}

    void insert(std::string s, int v)
    {
        SlashDict *sd = this;
        int i = 0, j = 0;
        for (i = 0, j = 0; j <= s.length(); j++)
        {
            if (s[j] == '/' || j == s.length())
            {
                if (i == j)
                { // 连续 /
                    i = j + 1;
                    continue;
                }
                std::string k = s.substr(i, j - i);
                sd = &sd->dic[k];
                sd->value=-1;
                i = j + 1;
            }
        }
        sd->value = v;
    }

    SlashDict get(std::string s)
    {
        SlashDict *sd = this;
        int i = 0, j = 0;
        try
        {
            for (i = 0, j = 0; j <= s.length(); j++)
            {
                if (s[j] == '/' || j == s.length())
                {
                    if (i == j)
                    { // 连续 /
                        i = j + 1;
                        continue;
                    }
                    std::string k = s.substr(i, j - i);
                    if (sd->dic.count(k))
                    {
                        sd = &sd->dic[k];
                    }
                    else
                    {
                        throw std::exception();
                    }
                    i = j + 1;
                }
            }
        }
        catch (std::exception &e)
        {
            std::cout << "KeyError: Dict under key '" << s.substr(0, i-1) << "' does not have key 'k'" << std::endl;
        }
        return *sd;
    }

    SlashDict pop(std::string s)
    {
        SlashDict *sd = this;
        SlashDict res;
        int i = 0, j = 0;
        for (i = 0, j = 0; j <= s.length(); j++)
        {
            if (s[j] == '/' || j == s.length())
            {
                if (i == j)
                { // 连续 /
                    i = j + 1;
                    continue;
                }
                std::string k = s.substr(i, j - i);
                if (sd->dic.count(k))
                {
                    if (j == s.length())
                    {
                        res = sd->dic[k];
                        sd->dic.erase(k);
                    }
                    else
                        sd = &sd->dic[k]; // 可记录每个sd,dic.size()==0时可回溯
                }
                i = j + 1;
            }
        }
        return res;
    }

    std::vector<std::string> deep_keys()
    {
        std::vector<std::string> vlist;
        std::string path;
        std::function<void(SlashDict * psd, std::string)> dfs = [&](SlashDict *psd, std::string path)
        {
            if (psd->value != -1)
            {
                vlist.push_back(path); // std::to_string(psd->value)
            }
            for (auto &[k, sd] : psd->dic)
            {
                dfs(&sd, path + k + "/");
            }
        };
        dfs(this, path);
        return vlist;
    }
};

int main()
{
    SlashDict sd;
    sd.insert("a/b/c/x", 1);
    sd.insert("a/b/c/y", 2);
    sd.insert("a/b/d", 3);
    sd.insert("e/f", 4);

    SlashDict sd2 = sd.get("a/b/c/x");
    std::cout << sd2.getValue() << "\n";
    sd2 = sd.get("a/b/d");
    std::cout << sd2.getValue() << "\n";

    sd2 = sd.get("a/b/k");

    std::cout<<"pop a/b/c/y\n";
    sd.pop("a/b/c/y");
    sd2 = sd.get("a/b/c/y");

    sd.insert("e/f/g",5);
    std::vector<std::string> list=sd.deep_keys();
    for(auto&s:list)
        std::cout<<s<<"\n";
    return 0;
}
#量化##23届秋招笔面经##23秋招##笔试##C/C++#
全部评论
老哥加油
点赞 回复 分享
发布于 2022-10-22 00:20 湖北

相关推荐

点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

更多
牛客网
牛客企业服务