字符串
Index
模式匹配 TODO
模式匹配基本方法
字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法 - 单车博客园 - 博客园
双指针
KMP
...
进制转换
10进制转任意进制
递归方法
迭代方法
任意进制转10进制
迭代方法
长地址转短地址
短 URL 系统是怎么设计的? - 知乎
基本思路
发号策略:给每一个收录的长地址,分配一个自增索引
将分配的索引转换为一个 62 进制数(10数字+26大写字母+26小写字母)
注意,发号机制不会判断是否重复
重复长地址怎么处理?
如果要求相同的长地址要对应唯一的短地址,那么唯一的方法就是维护一个映射表
但是维护一个映射表可能比忽略重复需要更多的空间
一个折衷的方法是——维护一个“最近”的长对短映射,比如采用一小时过期的机制来实现 LRU 淘汰
当一个地址被频繁使用,那么它始终在这个 key-value 表中,总能返回当初生成那个短地址
如果它使用并不频繁,那么长对短的 key 会过期,LRU 机制就会自动淘汰掉它
如何保证发号器的大并发高可用?
如果做成分布式的,那么多节点要保持同步加 1,多点同时写入,以 CAP 理论看,很难做到
一个简单的处理方式是,使用多个发号器,以奇偶/尾数区分
比如一个发单号,一个发双号;
或者实现 1000 个发号器,分别发尾号为 0 到 999 的号;每发一个号,每个发号器加 1000,而不是加 1
功能函数
atoi()
atoi()功能简述
将字符串(C风格)转换成整型;
会跳过前面的空格字符,直到遇上数字或正负号才开始转换;
如果遇到的第一个字符不是数字,则返回 0,并结束转化;
当遇到非数字或结束符('\0') 时结束转化,并将结果返回(整型)
如果发生溢出,则输出 INT_MAX 或 INT_MIN;
内置 atoi 不会处理 NULL 指针
合法样例:
核心代码(C++)
除了核心代码,更重要的是异常处理和溢出判断
完整代码
表达式转化(中缀,后缀,前缀)
前缀、中缀、后缀表达式 - CSDN博客
为什么要把中缀表达式转化为后缀,前缀?
计算机无法直接计算带有括号,以及区分优先级的表达式,或者说很难计算。
使用后缀,前缀,消除了括号和优先级。
如何计算后缀,前缀表达式?
手工求法:
中缀表达式与前、后缀表达式转化简单的技巧[转] - Hslim - 博客园
示例:
a+b*c-(d+e)第一步:按照运算符的优先级对所有的运算单位加括号
第二步:转换前缀与后缀表达式
计算机方法:
中缀转后缀
思路
从左到右遍历中缀表达式,遇到操作数则输出;遇到操作符,若当前操作符的优先级大于栈顶操作符优先级,进栈;否则,弹出栈顶操作符,当前操作符进栈。(这只是一段比较粗糙的描述,更多细节请参考链接或下面的源码)
中、前、后缀表达式 - CSDN博客
C++(未测试) <!-- - 只测试了部分样例,如果有未通过的样例请告诉我
以下代码中有一些循环可能是多余的;如果字符串合法,应该只需要判断一次,而不需要循环处理(未验证) -->
```C++
include
include
include
include
include
include
using namespace std;
//set l1{ '+', '-' }; //set l2{ '*', '/' }; // //vector> l{ l1, l2 };
int get_level(char c) { switch (c) { case '+': case '-': return 1; case '*': case '/': return 2; //case '(': // return 3; default: return -1; } }
string infix2suffix(const string& s) { stack tmp; // 符号栈 queue ans; // 必须使用 string 队列,因为可能存在多位数字 //stringstream ret; // 用字符流模拟队列
}
void solve() { // 只测试了以下样例,如果有反例请告诉我
}
```
最后更新于
这有帮助吗?