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

来源:互联网 发布:mac 浏览照片 下一张 编辑:程序博客网 时间:2024/06/06 04:04

#面试题  1:替换空格


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

出“We%20are%20happy.”;  


题目分析: 首先,我们应该想到的是原来是一个空格字符,替换之后变为三个字符 ‘%’ ,‘2’ ,‘0’;

如果我们直接在原来的字符串上进行替换,就有可能覆盖掉原本的内容;如果是创建新的字符串并

新的字符串上做替换,那么我们可以自己分配好足够的内存,所以我们应该向面试官问清楚如果面

试官告诉你在原本的字符串上做修改,并且内存足够,那么你就可以放手来做了。


算法选择:  如果我们选择正面替换,则遇到一个空格字符,就需要替换三个字符,那么空格后面的

所以内容就都要向后挪动三个字符的长度,你会发现,会有不少内容被重复移动,可以自己在本子上

画一画就清楚了,我在这里不做图解!   那么你就要考虑一下这种方法是否最简了,如果实在想不到,

就把这种方法写上吧,我在这里提供倒序替换,就是反着替换的方法,通过改变字符数组的方法实现;


代码如下:

#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>#define MAX 50void Replaceblank(char arr[]){int num = 0;//num统计空格的个数int length = 0;int newlength = 0;int i = 0;assert(arr);/*接下来这块得注意了,平时求字符串长度直接使用 *arr,进行移动arr++,如果你这里继续这样就错了,那样arr就指向第一个‘\0’去了,不信你这样试试;看看结果对不对!while(*arr){    length++;if(*arr == ' ')num++;}*/while(arr[i]!='\0'){length++;if(arr[i] == ' ')num++;i++;}newlength = length + 2*num;//newlength 是把空格替换成%20之后的长度if(newlength > MAX)//新数组都不能大于原数组最大长度return ;/*循环结束条件这里需要自己画图理解一下;因为是从后往前遍历,所以length肯定>=0;而新开辟的newlength 始终大于length,直到相遇;*/while(length >= 0 && newlength > length){if(arr[length] == ' '){arr[newlength--] = '0';arr[newlength--] = '2';arr[newlength--] = '%';}else{arr[newlength--] = arr[length];}--length;}}int main(){char arr[MAX] = "We are happy.";Replaceblank(arr);printf("%s\n",arr);system("pause");return 0;}

这道题我讲的比较粗糙,主要是没有画图理解,这个希望大家自己在底下按照我说的进行画图帮助理解!

谢谢!

1 0