//rplace.c
//题目:假设存在字符串“qwer tyubfg hsdf jjhg ”,并且该字符串具有足够大的空间编写算法将其中的空格字符用“%20”代替。
//要求:时间复杂度:O(n),空间复杂度:S(1)。
//算法分析:
//要实现时间复杂度为O(n),必须采用一重循环,并且循环控制由数组长度n控制,可以采用多次循环。
// 则不可用算法: 遍历数组遇见空格将空格替换成%20,然后将其后的各个元素向后移动,最坏的时间复杂度为:O(n^2),空间复杂度为:
// S(1)。
//要实现空间复杂度为S(1),必须用可见的,确定的中间变量。
// 则不可用算法:重新申请一个空的数组,然后将变换数组遍历,遇见空格在新数组中填入“%20”,非空格则赋值为变换数组的该位元素。
// 这种算法时间复杂度虽为O(n),但是空间复杂度为:S(n)。
//个人理解: 根据当前的生活环境和科技的发展状况,个人认为在大部分应用开发,时间复杂度是优于空间复杂度的,但是取舍总会有代价,
// 也是有相对性的,
// 所以算法没有最好只有相对最优,请根据自己的开发环境、要求、工作性质去选择最适合的算法。
//符合题目要求的算法:遍历两遍变换数组,第一遍,求出有几个空格,从而求出目标数组的长度。第二遍,两个指针,一个指向原数组最后
// 一个元素的地址记为olast,一个指向目标数组的最后一个元素地址记为nlast,从后向前进行遍历,用原数组长度作为循环控制条件,当
// olast指向的元素为空格时,nlast指针依次写入‘0’,‘2’,‘%’,当olast指向的元素不为空格时,nlast指针写入olast指针所指的
// 字符,当olast指针与nlast指针指向同一个位置即:到数组首地址偏移量相同时,就完成替换。(这里为了方便理解用两个指针说明,当
// 然,在具体实现的时候,定义两个整型,做为数组名的下标来表示这两个指针,最后结束条件为下标相等就好了)。
//***************************************************************************************************************************
//代码实现:
//2015-5-25
//***************************************************************************************************************************
//
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define STRMAX 100
void rplace(char *str);
int main(void)
{
char str[STRMAX] = "12 wer rty uiioo gdhsg hdaj k";
rplace(str);
puts(str);
return 0;
}
void rplace(char *str)
{
int i = 0;
int olen = 0, nlen = 0, num = 0;
if(NULL == str)
exit(0);
olen = strlen(str);
for( ; i<olen; ++i)
if(‘ ‘ == str[i])
++num;
nlen = olen + num*2;
while(olen < nlen)
{
if(‘ ‘ != str[olen])
{
str[nlen] = str[olen];
--nlen;
}
else
{
str[nlen--] = ‘0‘;
str[nlen--] = ‘2‘;
str[nlen--] = ‘%‘;
}
--olen;
}
}
//代码很简单,算法也很简单,这是一种思维方式,并不只是针对这到题目,学习算法,理解算法是初步,融会贯通才是王道。