题目描述

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
 package Solution;

 /**
* 剑指offer面试题4:替换空格
* 题目:请事先一个函数,把字符串中的每个空格替换成"%20"。
* 例如输入"We are happy.",则输出"We%20are%20happy."。
* @author GL
*
*/
public class No4ReplaceSpace { public static void main(String[] args) {
String string1="We are happy.";
String string2=" We are happy. ";
String string3="Wearehappy.";
//String string4=null;
String string5="";
String string6=" ";
String string7=" ";
System.out.println(replaceSpace(string1.toCharArray()));
System.out.println(replaceSpace(string2.toCharArray()));
System.out.println(replaceSpace(string3.toCharArray()));
//System.out.println(replace(string4.toCharArray()));
System.out.println(replaceSpace(string5.toCharArray()));
System.out.println(replaceSpace(string6.toCharArray()));
System.out.println(replaceSpace(string7.toCharArray()));
System.out.println(replaceSpace(new StringBuffer(string1)));
System.out.println(replaceSpace(new StringBuffer(string2)));
System.out.println(replaceSpace(new StringBuffer(string3)));
//System.out.println(replaceSpace(new StringBuffer(string4)));
System.out.println(replaceSpace(new StringBuffer(string5)));
System.out.println(replaceSpace(new StringBuffer(string6)));
System.out.println(replaceSpace(new StringBuffer(string7)));
} /*
* 时间复杂度为O(n)的解法:利用数组从后向前替换
* 1、先遍历一次字符串,统计出要替换的字符的个数
* 2、创建新的临时数组,数组长度为初始字符串字符个数+替换每个字符多出来的字符个数*要替换的字符个数
* 3、从原来字符串数组后面开始向前进行复制、替换到临时数组。两个数组下标变量分别为原始字符数组长度-1,临时数组长度-1
* 4、原始字符数组的字符如果不为空格,则把这个字符复制到临时数组的对应位置,两个数组下标都减1
* 5、原始字符数组的字符如果为空格,则把临时数组相对应的位置从后向前依次写入替换的字符,临时数组下标减少相应的替换的字符数量
* 6、循环复制替换,直到初始数组的下标小于0,此时替换完毕,临时数组转换成字符串后返回
*/
public static String replaceSpace(char[] string){
if(string==null)
return null;
int originalLength=string.length;
int spaceCount=0;
for(int i=0;i<originalLength;i++){
if(string[i]==' ')
spaceCount++;
}
int newLength=originalLength+2*spaceCount;
char[] temp=new char[newLength];
int i=originalLength-1;
int j=newLength-1;
while(i>=0){
if(string[i]==' '){
temp[j]='0';
temp[j-1]='2';
temp[j-2]='%';
j=j-3;
}else{
temp[j]=string[i];
j=j-1;
}
i=i-1;
}
return new String(temp);
} /*
* 时间复杂度为O(n),利用StringBuffer实现
* 通过indexOf(String str,int fromIndex)方法和subSequence(int start,int end)方法联合实现
*/
public static String replaceSpace(StringBuffer str){
if(str==null)
return null;
int fromIndex=0;
int index=0;
StringBuffer temp =new StringBuffer();
while(index<=str.length()){
index=str.indexOf(" ",fromIndex);
if(index>=0){
temp.append(str.subSequence(fromIndex, index)).append("%20");
index=index+1;
fromIndex=index;
}else{
temp.append(str.substring(fromIndex, str.length()));
break;
}
}
return temp.toString();
} }

剑指offer编程题Java实现——面试题4替换空格的更多相关文章

  1. 剑指offer编程题Java实现——面试题5从头到尾打印链表

    题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...

  2. 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现

    用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具 ...

  3. 剑指offer编程题Java实现——面试题10二进制中1的个数

    题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...

  4. 剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈

    剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()- ...

  5. 剑指offer编程题Java实现——面试题7用两个栈实现队列

    题目:用两个栈实现一个队列.队列的声明如下:请实现他的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列头部删除节点的功能. package Solution; ...

  6. 剑指offer编程题Java实现——面试题6重建二叉树

    题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...

  7. 剑指offer编程题Java实现——面试题11数值的整数次方

    题目: 实现函数double power(double base,int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值 ...

  8. 剑指offer编程题Java实现——面试题12打印1到最大的n位数

    题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...

  9. 剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前

    题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初 ...

随机推荐

  1. 显式提交/隐式提交 //ajax方式的隐式提交

    //创建jqueryAjax.html文件 <!DOCTYPE html><html><head><meta charset="UTF-8" ...

  2. Java学习笔记:23种设计模式

    设计模式(Design pattern)的定义: In software engineering, a software design pattern is a general, reusable s ...

  3. flask在其他文件中添加路由

    应用文件为:app.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): re ...

  4. 统计方形(NOIP1997)

    给链接:统计方形 这题是棋盘问题的数据加强版. 其实由于洛谷的数据比较水,所以你把我在棋盘问题题解中写的代码提交,也能AC. 但让给我们来看一个更优的解法. 先给代码: #include<bit ...

  5. Time的各种变量unity3d

    Time.time:(只读)表示从游戏开发到现在的时间,会随着游戏的暂停而停止计算. Time.timeSinceLevelLoad:(只读)表示从当前Scene开始到目前为止的时间,也会随着暂停操作 ...

  6. ssh 常用命令

    1.复制SSH密钥到目标主机,开启无密码SSH登录 ssh-copy-id user@host 如果还没有密钥,请使用ssh-keygen命令生成. 2.从某主机的80端口开启到本地主机2001端口的 ...

  7. 824. Goat Latin

    class Solution { public: string toGoatLatin(string S) { S.push_back(' '); //add a space that the loo ...

  8. c语言const和c++const

    1.常量 常量是指值不能被改变的量,又叫做字面值 1.1常量分类 1)字符常量:'a', 'A', '*'. 2)字符串常量:"helloworld","ilovechi ...

  9. vue中的前置守卫

    前置守卫是为了验证用户信息真实性,一些内容只能在用户登陆以后才能进行查看,例如个人中心,我的购物车,等个人页面,非隐私页面 用router.beforeEach进行验证,这个方法必须写在router实 ...

  10. hadoop flume 架构及监控的部署

    1 Flume架构解释  Flume概念 Flume是一个分布式 ,可靠的,和高可用的,海量的日志聚合系统 支持在系统中定制各类的数据发送方 用于收集数据 提供简单的数据提取能力 并写入到各种接受方 ...