首页 > 代码库 > 剑指Offer之替换空格

剑指Offer之替换空格

本身难度并不大,java一个replace();就可以了,或者另外开辟一个String,遍历一遍也是可行的,但是出发点并不是A题,而是考虑性能,程序在空间还有时间上的使用以及程序的鲁棒性,不过九度上的测试数据还真是大char数组要开到10^6次方。

普通的就不说了,介绍一下书中的方法。

假设str="We Are Happy";设置两个指针p1,p2。初始化为0.p1指的是原长度,p2指的是替换空格之后的。遍历一遍如果不算‘\0‘结尾符的话,p1=12,p2=16;

然后进行赋值操作,将p1指向的元素赋给p2,p1--,p2--。直到p1遇到一个空格,此时将“%20”插入到p2之前,p2-=3.p1--。重复操作,直到p1==p2。说明不再有空格。


其中C是上述方法,c++是另外开辟一个string。

java:

import java.util.Scanner;

public class Main {

	public static void main(String[] arges) {
		Scanner in = new Scanner(System.in);

		while (in.hasNextLine()) {
			String str = null;
			str = in.nextLine();
			System.out.println(str.replace(" ", "%20"));

		}

	}

}

c++:

#include <stdio.h>
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int main()
{
    
    //freopen("/Users/sanyinchen/Workspaces/oc/conse/B_ali/B_ali/in.txt","r",stdin);
    string templet="%20";
    char str[1000000];
    int n;
    while(gets(str))
    {
       getchar();
        string s="";
        n=strlen(str);
        
        for(int i=0;i<n;i++)
        {
            if(str[i]==' ')
            {
                s+=templet;
            }
            else
            {
                s+=str[i];
            }
        }
        cout<<s<<endl;
        
    }
    return 0;
}

c:

#include <stdio.h>
int main()
{
    
    //freopen("/Users/sanyinchen/Workspaces/oc/conse/B_ali/B_ali/in.txt","r",stdin);
    char str[1000000];
    int p1,p2;
    while(gets(str))
    {
        //getchar();
        p1=0;
        p2=0;
        for(int i=0;str[i]!='\0';i++)
        {
            p1++;
            p2++;
            if(str[i]==' ')
            p2+=2;
            
        }
          while(p1>=0&&p1!=p2)
        {
        if(str[p1]!=' ')
        {
        str[p2]=str[p1];
        p2--;
        p1--;
        }
        else{
            str[p2--]='0';
            str[p2--]='2';
            str[p2--]='%';
            p1--;
        }
           
            
        }
        printf("%s\n",str);
    }
      return 0;
}


剑指Offer之替换空格