首页 > 代码库 > 剑指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之替换空格
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。