一、字符串
- 字符:用''包括起来的单个符号,例如'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);
}