京东校招笔试题

1. 题目:

  题目摘自牛客网
  给定字符串(ASCII码0-255)数组,请在不开辟额外空间的情况下删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。例如:” i am a little boy. “,变成”i am a little boy”,语言不限,但不要用伪代码作答,函数输入输出请参考如下的函数原型:

void FormatString(char str[],int len){  }

2. 分析:

  这个题目如果没有不可辟额外空间的要求,我们可以另创建一个字符串数组,用于存放最终结果,做起来相对容易一些。但是本题要求不可另辟空间,也就是所有操作都需要在原字符串数组str[]上完成,所以题目相对而言要复杂一些。这里我们只需要明白一个地方,由于空格的存在,最终数组字符个数一定会比原数组长度短或相等。所以我们只要排除多余空格,后面数值指针依次前移即可,并不会发生数值覆盖引起数据丢失,最后结束提前增加一个字符串结束符’\0’即可。

3. C++程序:

#include<iostream>
#include<cstring>
using namespace std;

void FormatString(char str[],int len)
{
    int cur=0, prev=0;
    if (str == NULL || len <= 0)   //算法鲁棒性
            return;
    while(str[cur] == ' ')         // 处理开头空格,直到非空格字符出现
            ++cur;
    while(cur < len)                     
    {
            if ( str[cur] == ' ' && str[cur+1] == ' ')   //中间连着空格的处理,直到出现第一位是空格,第二位非空格
                    ++cur;
            else if ( str[cur] == ' ' && str[cur+1] == '\0') //末尾空格的处理,直接去除
                    break;
            else       //直接数值前移,去除中间多余空格
                    str[prev++] = str[cur++];
    }
    str[prev]  = '\0'; //新字符数组末尾加上结束符,去除原字符数组影响
}

int main( )
{
    char nArr[ ] = " i    am     a    good       boy!    ";
    FormatString(nArr, strlen(nArr));
    cout<< nArr <<endl;
    return 0;
}

个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!

转载请注明出处:CSDN 无鞋童鞋

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值