leetcode做题过程中遇到的神bug

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

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存的地址倒是没变,但是尝试用*访问就会出错。

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));
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值