`
810364804
  • 浏览: 781379 次
文章分类
社区版块
存档分类
最新评论

剑指offer面试题(4)—替换空格

 
阅读更多

题目:实现一个函数,把字符串的每一个空格替换成“%20”。例如输入“we are happy.",则输出”we%20are%20happy."

方法1.

从头到尾扫描字符串,每一个碰到空格字符的时候做替换。由于是把一个字符替换成三个字符,我们必须要把空格后面所有的字符都向后移动两个字节,否则就有两个字符被覆盖了。

代码如下:

#include<iostream>
using namespace std;
#define MAX 80
void Sp_Replace(char *str)
{
	for(int  i=0;str[i]!='\0';i++)
	{
		if(str[i]==' ')
		{
			for(int j=strlen(str)+2;j>=i+3;j--)
			{
				str[j]=str[j-2];
			}
			str[i]='%';
			str[i+1]='2';
			str[i+2]='0';
		}
	}
}
int main(void)
{
	char *str=(char *)malloc(sizeof(char )*MAX);
	cout<<"enter the string str"<<endl;
	gets(str);
	Sp_Replace(str);
	puts(str);
	return 0;
}


时间复杂度为0(n^2),效率太低

方法2.从字符串的后面开始复制和替换,准备两个索引,indexofNew 指向替换之后的字符串的末尾,indexofOriginal指向原始字符串的末尾。接下来向前移动指针indexofOriginal,逐个把它指向的字符复制到indexofNew的位置,直到碰到第一个空格为止,碰到第一个空格之后,把indexofOriginal移动1个位置,在indexofNew之前插入字符串"%20",此时indexofNew需向前移动三个位置。

代码:

#include<iostream>
using namespace std;
void Sp_Replace(char str[],int length)
{
	int originalLength=0;
	int numberofBlank=0;
	int indexofNew;
	int indexofOriginal;
	if(str==NULL && length<=0)
	{
		return ;
	}
	int i=0;
	while(str[i]!='\0')
	{
		originalLength++;
		if(str[i]==' ')
		{
			numberofBlank++;
		}
		i++;
	}
	indexofNew=originalLength+2*numberofBlank;//一个索引指向新字符串的尾部
	indexofOriginal=originalLength;//一个索引指向旧字符串的尾部
	while(indexofOriginal>=0 && indexofNew>indexofOriginal)
	{
		if(str[indexofOriginal]==' ')
		{
			str[indexofNew--]='0';
			str[indexofNew--]='2';
			str[indexofNew--]='%';
		}
		else
		{
			str[indexofNew--]=str[indexofOriginal];
		}
		indexofOriginal--;
	}
}
int main(void)
{
	char str[80];
	cout<<"input the originak string:"<<endl;
	gets(str);
	Sp_Replace(str,80);
	cout<<"the new string is:"<<endl;
	puts(str);

}


时间复杂度为O(n)

分享到:
评论

相关推荐

    剑指offer面试题5-替换空格C语言.cpp

    请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。输入:每个输入件仅包含一组测试样例。对于每组测试案例,输入一行代表要处理的字符...

    剑指offer(java版67题)

    面试题 2:替换空格(考点: 字符串) 2 面试题 3:从尾到头打印链表(考点: 链表) 2 面试题 4:重建二叉树(考点: 树) 4 面试题 5:用两个栈实现队列(考点: 栈和队列) 5 面试题 6:旋转数组的最小数字(考点:...

    【剑指offer】面试题5-替换空格-完整的可执行代码(Java)

    请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 解题思路参考:...

    《剑指Offer》刷题笔记——面试题05. 替换空格

    1、剑指解析: 2、特殊用例: 3、代码实现: I、原地双指针(从后向前复制)   从后向前复制是《剑指》推荐的一种解法,可以适用于各种编程语言。每' '比' '多两个字符。两个指针都是从后向前。通过先统计字符串...

    剑指offer之python实现

    面试题4 替换空格 面试题5 从尾到头打印单链表 面试题6 重建二叉树 面试题7 用两个栈实现队列 2.4 算法和数据操作 面试题8 旋转数组的最小数字 面试题9 斐波那契数列 面试题10 二进制中1的个数 第3章 高质量代码 3.3...

    leetcode-jian-zhi-offer:剑指Offer50题视频讲解

    道常见的程序员面试题,这些题目偏向中低难度,是入门上手不错的选择。另外这些题目基本上在各大 OJ 上也都有,可以非常方便地提交自己的实现进行练手。 如果刚开始练习算法题目,「剑指 Offer」是个不错的切入点。...

    point-to-offer-edition2:剑指offer第二版的java实现

    《剑指offer》,从名字上看虽不是一本系统的算法书,但很多师兄师姐都推荐它,因为很多互联网公司的面试算法题都能这本书上找到思路,链表,二叉树,图,查找,排序,时间空间的优化,队列,栈,覆盖面比较广且不...

    leetcode迷宫问题-LeetCode:LeetCode刷题之剑指offer系列

    面试题05:替换空格 +2 查找 面试题06:从尾到头打印链表 +2 栈+双数组 面试题07:重建二叉树 +2 递归 面试题09:用两个栈实现队列 +2 双栈 面试题10 - I:斐波那契数列 +2 动态规划+递归 面试题10 - II:青蛙跳台阶...

    leetcode分类-nowcoder:牛客网学习,包括剑指offer,程序员面试金典,leetcode,公司模拟真题,数据结构等

    每日刷题计划,记录做过的题目,内容包含剑指offer、程序员面试金典(CTCI)、数据结构 下面标题括号内的为对应包名 剑指offer(offer) java实现 03二维数组中的查找 04替换空格 05从尾到头打印链表 06重建二叉树 07用...

    leetcode中文版-Jianzhi-offer_python:健智提供python解决方案

    剑指Offer的Python解答 剑指Offer的Python解答,不断更新。如果数学公式无法正确显示,可以clone到本地查看,或者尝试使用Chrome插件“MathJax Plugin for Github”。 什么是剑指Offer? 精选谷歌、微软等知名IT企业...

    javalruleetcode-play-leetcode:用程序解决leetcode的算法问题

    剑指offer(第二版) 序号 题目列表 C实现 Python实现 Java实现 学习笔记 面试题03 数组中重复的数字 面试题04 二维数组中的查找 面试题05 替换空格 面试题06 从尾到头打印链表 面试题07 重建二叉树 面试题09 用两个栈...

    剑指Offer(Python多种思路实现):表示数值的字符串

    剑指Offer(Python多种思路实现):表示数值的字符串 面试20题: 题目:表示数值的字符串 题:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100″,”5e2″,”-123″,”3.1416″和”-1E...

    左程云leetcode-LeetCode:力扣解决方案

    替换空格(简单)][]       经典atoi(),注意范围越界处理   题型 找规律题 第二讲:找规律题 [面试题 01.08. 零矩阵 (简单)][]   [剑指 Offer 61. 扑克牌中的顺子(中等)][]   [面试题 16.11. 跳水板(简单...

    leetcode卡-LeetCode:LeetCode相关记录

    leetcode卡 LeetCode 每日一练 时间 序号 题目 03-01 P225 ...剑指offer 序号 题目 03 数组中重复的数字 04 二维数组中的查找 05 替换空格 06 从尾到头打印链表 07 重建二叉树 09 用两个栈实现队列 12

    LeetCode刷题笔记——91. 解码方法

      这一题比《剑指Offer》刷题笔记——面试题46. 把数字翻译成字符串麻烦了些,因为这里,0是不能翻的。 2、代码实现 class Solution: def numDecodings(self, s: str) -&gt; int: dp = [0] * len(s) # 考虑第一个...

    leetcode二维数组-programming_exercises:leetcode、nowcoder刷题之路

    剑指Offer编程题目录 二维数组中的查找: 替换空格: 从尾到头打印链表: 重建二叉树: 用两个栈来实现队列: 旋转数组的最小数字: 斐波那契数列: 跳台阶: 跳台阶2: 矩形覆盖: 二进制中1的个数 数值的整数次方: 调整数组...

    leetcode题库-work:C++后端开发面经整理

    leetcode题库 后端开发 操作系统 计算机网络 C++基础知识 数据库 笔试常考类型 模拟 ★★★★★ 可难可易 大部分题都是模拟中使用某个算法优化 ...剑指offer先刷 + leetcode以下各类型至少10道+leetc

Global site tag (gtag.js) - Google Analytics