Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

面试题5:替换空格 #16

Open
qiaoin opened this issue Apr 13, 2018 · 2 comments
Open

面试题5:替换空格 #16

qiaoin opened this issue Apr 13, 2018 · 2 comments

Comments

@qiaoin
Copy link

qiaoin commented Apr 13, 2018

现在给出的实现如下:

/*length 为字符数组str的总容量,大于或等于字符串str的实际长度*/
void ReplaceBlank(char str[], int length)
{
    if(str == nullptr && length <= 0)
        return;

    /*originalLength 为字符串str的实际长度*/
    int originalLength = 0;
    int numberOfBlank = 0;
    int i = 0;
    while(str[i] != '\0')
    {
        ++ originalLength;

        if(str[i] == ' ')
            ++ numberOfBlank;

        ++ i;
    }

    /*newLength 为把空格替换成'%20'之后的长度*/
    int newLength = originalLength + numberOfBlank * 2;
    if(newLength > length)
        return;

    int indexOfOriginal = originalLength;
    int indexOfNew = newLength;
    while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
    {
        if(str[indexOfOriginal] == ' ')
        {
            str[indexOfNew --] = '0';
            str[indexOfNew --] = '2';
            str[indexOfNew --] = '%';
        }
        else
        {
            str[indexOfNew --] = str[indexOfOriginal];
        }

        -- indexOfOriginal;
    }
}

我的考虑是 originalLength 的计算,在 strlen(string) 时,确实像上面的计算长度是没有错的,不用考虑字符数组最后的空字符 \0,在这里的话,考虑边界条件,个人觉得应该添加如下改动:

  1. 在计算 newLength 之前,将 originalLength 给多计算一个字符,算上最后的空字符 \0,其他的保持不变即可;
  2. 如果考虑和 strlen(string) 一样的语义,在计算 originalLength 时就用如上的代码计算长度即可,但在判断得到的 newLength 是否超出 length 时,需要
    if(newLength +> length)
        return;

这样保证替换之后的字符串的最后一位空字符是字符数组提供的,在测试时,传入的字符数组是 char str[100] = "We are happy.",其13-99索引号均填充为 \0

以上 1 和 2 两种方案选择一种即可。

@LJoiner
Copy link

LJoiner commented Nov 23, 2018

现在给出的实现如下:

/*length 为字符数组str的总容量,大于或等于字符串str的实际长度*/
void ReplaceBlank(char str[], int length)
{
    if(str == nullptr && length <= 0)
        return;

    /*originalLength 为字符串str的实际长度*/
    int originalLength = 0;
    int numberOfBlank = 0;
    int i = 0;
    while(str[i] != '\0')
    {
        ++ originalLength;

        if(str[i] == ' ')
            ++ numberOfBlank;

        ++ i;
    }

    /*newLength 为把空格替换成'%20'之后的长度*/
    int newLength = originalLength + numberOfBlank * 2;
    if(newLength > length)
        return;

    int indexOfOriginal = originalLength;
    int indexOfNew = newLength;
    while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
    {
        if(str[indexOfOriginal] == ' ')
        {
            str[indexOfNew --] = '0';
            str[indexOfNew --] = '2';
            str[indexOfNew --] = '%';
        }
        else
        {
            str[indexOfNew --] = str[indexOfOriginal];
        }

        -- indexOfOriginal;
    }
}

我的考虑是 originalLength 的计算,在 strlen(string) 时,确实像上面的计算长度是没有错的,不用考虑字符数组最后的空字符 \0,在这里的话,考虑边界条件,个人觉得应该添加如下改动:

  1. 在计算 newLength 之前,将 originalLength 给多计算一个字符,算上最后的空字符 \0,其他的保持不变即可;
  2. 如果考虑和 strlen(string) 一样的语义,在计算 originalLength 时就用如上的代码计算长度即可,但在判断得到的 newLength 是否超出 length 时,需要
    if(newLength +> length)
        return;

这样保证替换之后的字符串的最后一位空字符是字符数组提供的,在测试时,传入的字符数组是 char str[100] = "We are happy.",其13-99索引号均填充为 \0

以上 1 和 2 两种方案选择一种即可。

还有,开头的判断:if(str == nullptr && length <= 0) 应该改为: if(str == nullptr || length <= 0)

@mhsszm
Copy link

mhsszm commented Feb 18, 2019

边界条件未处理到位的情况,当测试用例1,改为:
// 空格在句子中间
void Test1()
{
const int length = 13;

char str[length] = "hello world";
Test("Test1", str, length, "hello%20world");

}
按作者的意思是要return ;的,可实际并没有,导致后面程序崩溃。1楼,2楼讲的很好。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants