去除字符串中的空格,不允许开辟新的空间,只能申请简单类型的自动变量。时间复杂度要求为O(n)。...

本文介绍了一种用于去除字符串中多余空格的算法,并提出了优化方案。通过两个指针定位空格与非空格字符,实现高效替换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例:

原始数据

    char str[] = "abc d  e   fgh i    jk l  m "; 

处理后

    str[] = "abcdefghijklm";

思路:

    1. p_space指向第一个空格字符

    2. p_char指向p_space后的第一个非空格字符

    3. 交换p_space和p_char的内容,且++p_space,使其指向下一个空格字符

    4. 重复步骤2、3,直到p_space或p_char指向‘\0’

    5. *p_space = '\0',结束算法

void remove_space(char *pStr)
{
    char *p_space, *p_char;

    if (pStr == NULL)
        return;
    //p_space指向第一个空格字符
    for (p_space = pStr; *p_space != ' '; ++p_space);
    //当p_space不指向字符串结尾时,寻找它后面的第一个非空格字符
    while (*p_space != '\0')
    {
        for (p_char = p_space; *p_char == ' '; ++p_char);

        if (*p_char == '\0')
            break;  
        else
        {
            *p_space = *p_char;
            *p_char = ' ';
            ++p_space;
        }
    }
    *p_space = '\0'; //新的结束标记
    return ;
}

算法改进

    上面的算法中都是从p_space开始寻找第一个非空格字符,存在效率方面的不足,以下为改进版本

思路:

    不从p_space开始寻找第一个非空格字符,而是从上一次的p_char开始寻找它后面的第一个非空格字符,流程如下

    1. p_space指向第一个空格字符,p_seach_begin指向p_space后的第一个非空格字符

    2. p_char指向p_seach_begin后的第一个非空格子字符

   3. 交换p_space和p_char的内容,且++p_space,使其指向下一个空格字符,更新p_seach_begin为p_char

    4. 重复步骤2、3,直到p_seach_begin或p_char指向‘\0’

    5. *p_space = '\0',结束算法

void remove_space_v2(char *pStr)
{
    char *p_space, *p_seach_begin,*p_char;
    if (pStr == NULL)
        return;

    //p_space指向第一个空格字符
    for (p_space = pStr; *p_space != ' '; ++p_space);
    //p_seach_begin指向第一个非空格字符
    for (p_seach_begin = p_space; *p_seach_begin == ' '; ++p_seach_begin);

    while (*p_seach_begin != '\0')
    {
        for (p_char = p_seach_begin; *p_char == ' '; ++p_char);
        if (*p_char == '\0')
            break;
        else
        {
            *p_space = *p_char;
            *p_char = ' ';
            ++p_space;
            p_seach_begin = p_char;
        }

    }
    *p_space = '\0'; //新的结束标记
    return;
}

 

 

转载于:https://my.oschina.net/u/1267048/blog/889494

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值