//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;
    }
}
//代码很简单,算法也很简单,这是一种思维方式,并不只是针对这到题目,学习算法,理解算法是初步,融会贯通才是王道。