leetcode做题过程中遇到的神bug

leetcode做题过程中遇到的神bug,第1张

很多问题是我自己水平不够,才难以理解。


1.std::string基础数据结构不合理

例:

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 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存的地址倒是没变,但是尝试用*访问就会出错。


mapm;
int *r;
for(auto it:intervals){
//1
    r=&it[1];
    m.insert(pair(it[0],r));
    r=nullptr;
}
mapm;
for(auto it:intervals){
//1
    int *r=&it[1];
    m.insert(pair(it[0],r));
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/584544.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存