使用C++写leetcode算法的一些总结

本文内容依据我在使用 C++ 完成各类 leetcode 问题时得到的有效信息和经验写成。

P.S. 可能更强调在 c++ 的使用上而非各类逆天的算法解决方案上。

map

总的来说 map 是一个非常好用的东西，很多可以用 set 的问题我依然使用 map 来解决，感觉很舒服。

创建

创建的时候需要指定好类型 map or unordered_map < type , type > variable_name，创建出来是空的。拿unordered_map<string,int> maps来举例。

插入删除

对于计数型应用 (反正做题比较多)，即后一个 type 是 int 的情况，用起来很简单，直接maps["hello"]++，这样就在创建了对应 key 值并 + 1。这里使用上值得注意，当 key 对应的 value 值减到 0 时，并不意味着这个 key 就消失了，需要maps.erase("hello")才能真正抹掉对应的 key 值。

其它的应用就需要使用maps.insert(pair<string,string>("hello","world"))来插入了。

查找

作为一个哈希表，查找是其得到使用的根本原因。

看一个 key 是不是在表里， if(maps.find("hello")!=maps.end()) ，如果返回 true，则说明在表里。这里的返回值是一个迭代器，迭代器这么用，maps.find("hello")->first ，这就是 key 的值（也就是 "hello"），maps.find("hello")->second ，这就是 "hello" 对应的 value 值。

想遍历 map，也得靠迭代器，先造个迭代器，unordered_map<string,int>::iterator itr，然后 for 循环的用法就跟一般的遍历差不多了。for(itr=maps.begin();itr!=maps.end();itr++)这样就能遍历啦。

string

string 的各种操作用法千奇百怪，很多感觉几乎等效。

assign

大概用法是 s1.assign (s,index,num) ，这样可以把 s 字符串从 index 索引值开始往后的 num 个字符赋给 s1 字符串。

基本跟 substr 是一样的。

substr

s1=s.substr(index,num) ，这个操作跟使用 assign 是等效的。

for

for 循环一些自动遍历的 trick 之前没用过。

比如for(auto i:nums)或者for(auto &i:maps)，后者取值用t.first和t.second即可。也可以for(auto &[key,vaule]:maps)就能直接取到 key 和 value 啦。

reverse

这个好像可以用来反转很多 C++ 支持的数据结构，一般是两个输入参量，用法大概是这样。reverse (开始位置，开始位置 + 需要翻转的数量)，从这个角度看，它的输入参量是左闭右开的区间，例如reverse(string.begin(),string.end())...

反正第一次用起来有点晕，极有可能 c++ 很多的标准函数采用类似的输入形式，需要注意。

resize

反正对于字符串而言挺好使，直接 resize (更新后的尺寸)，可以直接把字符串扩充到指定长度，多出来的部分应该是空的吧。

sort

sort(begin(),end())这样用，反正可以直接按从小到大光速排序，这里的开始和结束参照 reverse，输入是完全一样的方法。说明前面的猜想是正确的😄。

好像还可以用自定义函数作为第三个输入参量来作为排序依据，这个等以后做题遇到的时候再写吧，没用过的东西一概不写😋。