吉大考研复试准备-力扣345. 反转字符串中的元音字母(注意字符数组越界问题)

题目:

代码:

AddressSanitizer: heap-buffer-overflow,报错是这个,这是因为出现了字符串数组的越界访问

int judge(char ch)
{
    if(ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u')
        return 1;
    else if(ch=='A'||ch=='E'||ch=='I'||ch=='O'||ch=='U')
        return 1;
    else
        return -1;
}

char* reverseVowels(char* s)
{
    int len=0;
    for(int i=0;s[i]!='\0';i++)
        len++;

    int l=-1,r=len;
    while(l<r)
    {
        l++;
        while(judge(s[l])==-1&&s[l]!='\0')
            l++;
        r--;
        while(judge(s[r])==-1&&r>0)///刚开始这里写了r>=0,所以会越界
            r--;
        if(l<r)
        {
            char ch=s[l];
            s[l]=s[r];
            s[r]=ch;
        }
    }
    return s;
}

leetcode判定算法还是严格的,以前构思双指针遍历办法的时候总是忽略两个指针越界访问的问题,长个记性了。

再补充一个同样的问题,在做这种遍历的时候千万小心,尤其是从尾到头遍历,循环不能取0

58. 最后一个单词的长度

int lengthOfLastWord(char* s)
{
    int n=0;
    for(int i=0;s[i]!='\0';i++)
        n++;
        
    int len=0,i;
    for(i=n-1;i>=0;i--)
        if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
             break;
    for(int j=i;s[j]!=' '&&j>=0;j--)//这里也存在这个问题
但是j又必须访问到0位,所以加一行if判断
    {
        len++;
        if(j==0)
            break;
    }
    return len;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值