很多问题是我自己水平不够,才难以理解。
1.std::string基础数据结构不合理
例:
请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
我的代码
class Solution {
public:
string replaceSpace(string s) {
char n;
while((n=s.find(' '))!= string::npos){
s.replace(n,1,"%20");
}
return s;
}
};
自己测的很多字符串都没问题,然而:
查了资料才知道:
std::string基础数据结构不合理, 一些场景下会有不可思议的BUG:不应该是char为基础的容器,内部早就应该改为unsigned char(byte)了,一个是可以直接进行二进制比较,一个是在一些特殊场景下很容易出bug, 例如vector1.at( string1[0] ), 如果第一个字符是'\x81', 本来期望是读取容器第129个内容,但这里会是一个负数转为整数后溢出。
很多软件公司内部都有实现一个优化版本的string, 典型的就是facebook folly中的fbstring 。
ps,这道题我换了解法通过了:
class Solution {
public:
string replaceSpace(string s) {
string result="";
for(char n:s){
if(n!=' ')result=result+n;
else result=result+"%20";
}
return result;
}
};
2.nums.size()不是int,易出错
建议在每次复杂处理数组之前进行如下处理:
int n=nums.size();
否则,.size()不是int类型,很容易在min(),max()和常规的符号比较中(>/>=/</<=/==等)出现意料之外的情况。
3.循环创建指针并存入数组,易出错
想通过循环,创建一个int和int型指针的map,结果每次新一轮循环时,上一次的指针内容就被清空了,m存的地址倒是没变,但是尝试用*访问就会出错。
map<int ,int*>m;
int *r;
for(auto it:intervals){
//1
r=&it[1];
m.insert(pair(it[0],r));
r=nullptr;
}
map<int ,int*>m;
for(auto it:intervals){
//1
int *r=&it[1];
m.insert(pair(it[0],r));
}