# 剑指Offer - 面试题5：替换空格

### 题目

0 <= s 的长度 <= 10000

### 分析

C

#include<stdio.h>
#include<string.h>
void ReplaceBlank(char string[], int length)
{
int i = 0;
int count = 0;//计算多少个空格
for(i = 0; string[i] != '\0'; i++)//从前向后遍历
{
if (string[i] == ' ')//找到空格
{
count++;
for (int j = length - 1 + count * 2; j > i + 2; j--)//找临界条件
{
string[j] = string[j - 2];
}
string[i++] = '%';
string[i++] = '2';
string[i++] = '0';
}
}
string[i] = '\0';
}
int main()
{
char s[30] = "We are happy.";
ReplaceBlank(s, 13);
printf("%s\n", s);
return 0;
}

C

void ReplaceBlank(char string[], int length)
{
int count = 0;
for (int i = 0; i < length; i++)//计算空格数量
{
if (string[i] == ' ')
{
count++;
}
}
//从\0开始省去了最后添加\0
int end = length + count * 2;
int start = length;
while (start > 0 || start != end)
{
if (string[start] == ' ')
{
string[end--] = '0';
string[end--] = '2';
string[end--] = '%';
start--;
}
else
{
string[end--] = string[start--];
}
}
}
int main()
{
char s[30] = "We are happy.";
ReplaceBlank(s, 13);
printf("%s\n", s);
return 0;
}

C++

#include<iostream>
using namespace std;
class Solution {
public:
string ReplaceBlank(string str) {
int count = 0;
int len = str.size();
for (char c : str) // 统计空格数量
{
if (c == ' ')
{
count++;
}
}
str.resize(len + 2 * count);//重置字符串长度
//遍历修改
int end = str.size() - 1;
int start = len - 1;
while(start < end && start >= 0)
{
if (str[start] == ' ')
{
str[end--] = '0';
str[end--] = '2';
str[end--] = '%';
start--;
}
else
{
str[end--] = str[start--];
}
}
return str;
}
};
int main()
{
Solution s;
string str = "We are happy.";
string ret = s.ReplaceBlank(str);
cout << ret << endl;
return 0;
}

### 思想

#include<stdio.h>
void MergeArray(int arr1[], int arr2[], int len1, int len2)
{
int end = len1 + len2 - 1;  //尾插的指针
int i = len1 - 1;     //记录arr1数组的位置
int j = len2 - 1;     //记录arr2数组的位置
while (i >=0 && j >= 0 && end >= 0)
{
if (arr1[i] > arr2[j])  //arr1大
{
arr1[end--] = arr1[i--];
}
else          //arr2大
{
arr1[end--] = arr2[j--];
}
}
while(i >= 0) //arr2提前完了
{
arr1[end--] = arr1[i--];
}
while (j >= 0)  //arr1提前完了
{
arr1[end--] = arr2[j--];
}
}
void print(int arr[], int len)
{
for (int i = 0; i < len && arr[i] != 0; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr1[20] = { 1,3,7,9,11 };
int arr2[5] = { 2,4,6,8,10 };
int len1 = 5;
int len2 = 5;
MergeArray(arr1, arr2, len1, len2);
print(arr1, len1 + len2);
return 0;
}

|
2月前
【一刷《剑指Offer》】面试题 23：从上往下打印二叉树
【一刷《剑指Offer》】面试题 23：从上往下打印二叉树
36 0
|
2月前
【一刷《剑指Offer》】面试题 22：栈的压入、弹出系列
【一刷《剑指Offer》】面试题 22：栈的压入、弹出系列
28 0
|
2月前
|

【一刷《剑指Offer》】面试题 21：包含 main 函数的栈
【一刷《剑指Offer》】面试题 21：包含 main 函数的栈
14 0
|
2月前
【一刷《剑指Offer》】面试题 20：顺时针打印矩阵
【一刷《剑指Offer》】面试题 20：顺时针打印矩阵
39 0
|
2月前
【一刷《剑指Offer》】面试题 19：二叉树的镜像
【一刷《剑指Offer》】面试题 19：二叉树的镜像
24 0
|
2月前
【一刷《剑指Offer》】面试题 18：树的子结构
【一刷《剑指Offer》】面试题 18：树的子结构
29 0
|
2月前
【一刷《剑指Offer》】面试题 17：合并两个排序的链表
【一刷《剑指Offer》】面试题 17：合并两个排序的链表
24 0
|
2月前
【一刷《剑指Offer》】面试题 16：反转链表
【一刷《剑指Offer》】面试题 16：反转链表
31 0
|
2月前
【一刷《剑指Offer》】面试题 15：链表中倒数第 k 个结点
【一刷《剑指Offer》】面试题 15：链表中倒数第 k 个结点
27 0
|
2月前
|
C++
【一刷《剑指Offer》】面试题 14：调整数组顺序使奇数位于偶数前面
【一刷《剑指Offer》】面试题 14：调整数组顺序使奇数位于偶数前面
28 0