剑桥offer面试题4: 空格替换 请实现一个函数,把字符串中的每个空格替换成“%20“。例如输入“We are happy.“,则输出“We%20are%20happy.“ |代码均可运行

一、字符串

  • 字符:用''包括起来的单个符号,例如'0','A','a','\0'
  • 字符数组:字符(char)类型定义的数组.例如char arr[10];.字符数组如果有'\0'则是字符串,否则不是。   (学习,考试和工作的重点)
  • 判断字符数组是否为字符串依据:有没有字符'\0'
  • 字符串:用" "包括的字符序列,包含0个及以上字符.例如"abcd".

注意:字符串的末尾包含一个隐藏的'\0'       '\0'是字符串的结尾标记
不安全:只有数组越界

int main()
{
    char arr[10] = { 'a','b','c','d','e','f','g','h','i','j' };//不是字符串
    char brr[10] = { 'a','b','c','d','e','f'};//剩余部分为0('\0'),是字符串
    char crr[] = { 'a','b','c','d','e','f','g','h','i','j' };//自动推导,不是字符串
    char drr[10]; //随机值  "烫",不是字符串

    //字符数组特有
    char err[10] = {"abcde"};//字符串
    char frr[10] = "abcde";//是字符串
    char grr[10] = "abcd\0ef";//输出为abcd
    char hrr[10] = {'a','b','\0','c','d'};//输出为ab
    printf("%s\n",hrr);//%s:输出字符串

    return 0;
}

二、题目:

请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入"We are happy.",则输出"We%20are%20happy."

三、算法和代码

1.算法一:双指针:

要是从头开始替换,空格后面的字符要移动多次,当空格有n个时,时间复杂度为O(n²),可以从后往前使用两个指针,一个指向替换后字符串末尾,一个指向替换前字符串末尾,依次向前替换空格。

1.首先遍历一遍原数组,求出最终答案的长度length;

2.将原数组resize成length大小;

3.使用两个指针,指针i指向原字符串的末尾,指针j指向length的位置;

4.两个指针分别从后往前遍历,如果str[i] == ' ',则指针j的位置上依次填充'0', '2', '%',这样倒着看就是"%20";如果str[i] != ' ',则指针j的位置上填充该字符即可。

 具体代码:

class Solution {
public:
    string Replace_str(string& str)
    {
        int len = 0;//计算出替换后字符串的长度
        for (auto c : str)
        {
            if (c == ' ')
            {
                len += 3;
            }
            else
            {
                len++;
            }
        }

        int i = str.size();//指向原字符串末尾i=13
        int j = len;//指向替换后字符串的末尾j=16

        str.resize(len);//将string字符串有效个数改为替换后的len长度

        while (i >= 0 && i <= j)
        {
            if (str[i] == ' ')
            {
                str[j--] = '0';
                str[j--] = '2';
                str[j--] = '%';

            }
            else
            {
                str[j--] = str[i];
            }
            i--;
        }
        return str;
    }
};
int main()
{
    string str = "We are happy.";
    Solution s;
    cout << s.Replace_str(str);//We%20are%20happy.
    return 0;
}

2.算法二:使用STL,在string字符串中寻找空格,找到就将其replace替换成“%20”

具体代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

class Solution {
public:
    string Replace_str(string& str)
    {
        string::size_type p;
        while ((p = str.find(' ')) != string::npos)
        {
            str.replace(p, 1, "%20");//替换
        }
        return str;
    }
};

int main()
{
    string str = "We are happy.";
    Solution s;
    cout << s.Replace_str(str);//We%20are%20happy.
    return 0;
}

3.算法三

1.先遍历一遍字符串,计算出空格的个数,动态开辟一个替换后字符串长度的空间

2. 将旧的字符串中的字符依次复制到新的字符串中,遇到空格则给新的字符串添加‘%20’

具体代码: 

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

void Replace_str(char* str)
{
    if (str == NULL)
    {
        return;
    }
    int len = strlen(str)+1;
    int n = 0;//字符串中空格数
    char* p = str;
    for (; *p != '\0'; p++)
    {
        if (*p == ' ')
        {
            n++;
        }
    }
    int size = len + 2 * n;//替换后字符串长度
    char* ptr = (char*)malloc(sizeof(char) * size + 1);
    char* q = ptr;
    for (int i = 0, j = 0; i < len; i++, j++)
    {
        if (str[i] == ' ')
        {
            ptr[j] = '\%';
            ptr[++j] = '2';
            ptr[++j] = '0';
        }
        else
        {
            ptr[j] = str[i];
        }
    }
    for (; *q != '\0'; q++)
    {
        cout << *q;
    }
}

int main()
{
    char str[] = "We are happy.";
    Replace_str(str);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宠宠熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值