剑指offer——面试题5:替换空格

利用STL:

 1 #include"iostream"
 2 #include"stdio.h"
 3 #include"algorithm"
 4 using namespace std;
 5
 6 string ReplaceBlank(string src)
 7 {
 8     if(src.find(" ")>src.length())
 9         return src;
10     while(src.find(" ")<src.length())
11     {
12         int pos=src.find(" ");
13         src=src.replace(pos,1,"%20");
14     }
15     return src;
16 }
17
18 void Test(char *testName,string testStr,string resStr)
19 {
20     if(testName!=nullptr)
21         printf("the %s begin:",testName);
22     if(testStr=="")
23     {
24         printf("the source string is null!\n");
25         return;
26     }
27     string res=ReplaceBlank(testStr);
28     if(res==resStr)
29         printf("passed.\n");
30     else
31         printf("failed\n");
32 }
33
34 //包含空格的字符串
35 void Test1()
36 {
37     Test("Test1","We are happy enough !","We%20are%20happy%20enough%20!");
38 }
39
40 //不包含空格的字符串
41 void Test2()
42 {
43     Test("Test2","WeAreHappy","WeAreHappy");
44 }
45
46 //空字符串
47 void Test3()
48 {
49     Test("Test3","","");
50 }
51
52 int main()
53 {
54     Test1();
55     Test2();
56     Test3();
57     return 0;
58 }

官方给出的O(n)复杂度的算法:

  1 // 面试题5:替换空格
  2 // 题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,
  3 // 则输出“We%20are%20happy.”。
  4
  5 #include <cstdio>
  6 #include <cstring>
  7
  8 /*length 为字符数组str的总容量,大于或等于字符串str的实际长度*/
  9 void ReplaceBlank(char str[], int length)
 10 {
 11     if(str == nullptr && length <= 0)
 12         return;
 13
 14     /*originalLength 为字符串str的实际长度*/
 15     int originalLength = 0;
 16     int numberOfBlank = 0;
 17     int i = 0;
 18     while(str[i] != ‘\0‘)
 19     {
 20         ++ originalLength;
 21
 22         if(str[i] == ‘ ‘)
 23             ++ numberOfBlank;
 24
 25         ++ i;
 26     }
 27
 28     /*newLength 为把空格替换成‘%20‘之后的长度*/
 29     int newLength = originalLength + numberOfBlank * 2;
 30     if(newLength > length)
 31         return;
 32
 33     int indexOfOriginal = originalLength;
 34     int indexOfNew = newLength;
 35     while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
 36     {
 37         if(str[indexOfOriginal] == ‘ ‘)
 38         {
 39             str[indexOfNew --] = ‘0‘;
 40             str[indexOfNew --] = ‘2‘;
 41             str[indexOfNew --] = ‘%‘;
 42         }
 43         else
 44         {
 45             str[indexOfNew --] = str[indexOfOriginal];
 46         }
 47
 48         -- indexOfOriginal;
 49     }
 50 }
 51
 52 // ====================测试代码====================
 53 void Test(char* testName, char str[], int length, char expected[])
 54 {
 55     if(testName != nullptr)
 56         printf("%s begins: ", testName);
 57
 58     ReplaceBlank(str, length);
 59
 60     if(expected == nullptr && str == nullptr)
 61         printf("passed.\n");
 62     else if(expected == nullptr && str != nullptr)
 63         printf("failed.\n");
 64     else if(strcmp(str, expected) == 0)
 65         printf("passed.\n");
 66     else
 67         printf("failed.\n");
 68 }
 69
 70 // 空格在句子中间
 71 void Test1()
 72 {
 73     const int length = 100;
 74
 75     char str[length] = "hello world";
 76     Test("Test1", str, length, "hello%20world");
 77 }
 78
 79 // 空格在句子开头
 80 void Test2()
 81 {
 82     const int length = 100;
 83
 84     char str[length] = " helloworld";
 85     Test("Test2", str, length, "%20helloworld");
 86 }
 87
 88 // 空格在句子末尾
 89 void Test3()
 90 {
 91     const int length = 100;
 92
 93     char str[length] = "helloworld ";
 94     Test("Test3", str, length, "helloworld%20");
 95 }
 96
 97 // 连续有两个空格
 98 void Test4()
 99 {
100     const int length = 100;
101
102     char str[length] = "hello  world";
103     Test("Test4", str, length, "hello%20%20world");
104 }
105
106 // 传入nullptr
107 void Test5()
108 {
109     Test("Test5", nullptr, 0, nullptr);
110 }
111
112 // 传入内容为空的字符串
113 void Test6()
114 {
115     const int length = 100;
116
117     char str[length] = "";
118     Test("Test6", str, length, "");
119 }
120
121 //传入内容为一个空格的字符串
122 void Test7()
123 {
124     const int length = 100;
125
126     char str[length] = " ";
127     Test("Test7", str, length, "%20");
128 }
129
130 // 传入的字符串没有空格
131 void Test8()
132 {
133     const int length = 100;
134
135     char str[length] = "helloworld";
136     Test("Test8", str, length, "helloworld");
137 }
138
139 // 传入的字符串全是空格
140 void Test9()
141 {
142     const int length = 100;
143
144     char str[length] = "   ";
145     Test("Test9", str, length, "%20%20%20");
146 }
147
148 int main(int argc, char* argv[])
149 {
150     Test1();
151     Test2();
152     Test3();
153     Test4();
154     Test5();
155     Test6();
156     Test7();
157     Test8();
158     Test9();
159
160     return 0;
161 }

原文地址:https://www.cnblogs.com/acm-jing/p/10382019.html

时间: 2025-01-10 19:17:52

剑指offer——面试题5:替换空格的相关文章

剑指offer系列源码-替换空格

题目1510:替换空格 时间限制:1 秒内存限制:128 兆特殊判题:否提交:7383解决:1889 题目描述: 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 输入: 每个输入文件仅包含一组测试样例. 对于每组测试案例,输入一行代表要处理的字符串. 输出: 对应每个测试案例,出经过处理后的字符串. 样例输入: We Are Happy 样例输出: We%20Are%20Happ

剑指offer第二题:替换空格(python)

题目描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 思路: 先计算出新字符串的长度,再从后向前替换空格,这样时间复杂度最少,为O(n).通过列表来操作替换,最后将列表组合成字符串. class Solution: # s 源字符串 def replaceSpace(self, s): # write code here if not isinstance(s, str) or

【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2858解决:924 题目描写叙述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部的奇数位于数组的前半部分,全部的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每一个输入文件包括一组測试案例. 对于每一个測试案例.第一行输入一个n,代表该数组

【剑指Offer面试题】二维数组中的查找

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个

【剑指Offer面试题】九度OJ1384:二维数组中的查找

下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有优点的.加油~ 题目链接地址: http://ac.jobdu.com/problem.php?pid=1384 二维数组中的查找

【剑指Offer面试题】 九度OJ1386:旋转数组的最小数字

题目链接地址: http://ac.jobdu.com/problem.php?pid=1386 题目1386:旋转数组的最小数字 时间限制:1 秒内存限制:32 兆特殊判题:否提交:6914解决:1534 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为

剑指Offer 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解

剑指Offer 面试题36:数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 例如, 在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4),输出5. 提交网址: http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188 或 htt

二叉树层次遍历(剑指Offer面试题32:从上到下打印二叉树)

图1所示为二叉树的层次遍历,即按照箭头所指方向,按照1.2.3的层次顺序,对二叉树每个节点进行访问 (此图反映的是自左至右的层次遍历,自右至左的方式类似). 要进行层次遍历,需要建立一个队列.先将二叉树头节点入队列,然后出队列,访问该节点, 如果它有左子树,则将左子树的根结点入队:如果它有右子树,则将右子树的根结点入队.然后出队列,对出队节点访问, 如此反复直到队列为空为止. 1 import java.util.*; 2 class TreeNode 3 { 4 int val; 5 Tree

[ 剑指offer ] 面试题8:二叉树的下一个节点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 解题思路 1.找到所有的可能情况并归纳,写的代码需要把这些情况都覆盖到. 2.具体情况详见书本# -*- coding:utf-8 -*- # class TreeLinkNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None # self

剑指offer面试题29:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字,例如输入一个长度为9的数组(1,2,3,2,2,2,5,4,2,).由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 个人第一眼想法是通过一个sort函数,再判断中间那数出现次数,只要出现多于n/2,就直接输出. 一般来说,最为直观的算法面试官都不会满意,那么有没有更优的算法呢? 这种算法是受快速排序算法的启发.在随机快速排序算法中,我们现在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字