剑指offer编程题Java实现——面试题4替换空格
题目描述
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替换空格的更多相关文章
- 剑指offer编程题Java实现——面试题5从头到尾打印链表
题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...
- 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现
用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具 ...
- 剑指offer编程题Java实现——面试题10二进制中1的个数
题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...
- 剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈
剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()- ...
- 剑指offer编程题Java实现——面试题7用两个栈实现队列
题目:用两个栈实现一个队列.队列的声明如下:请实现他的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列头部删除节点的功能. package Solution; ...
- 剑指offer编程题Java实现——面试题6重建二叉树
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...
- 剑指offer编程题Java实现——面试题11数值的整数次方
题目: 实现函数double power(double base,int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值 ...
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...
- 剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前
题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初 ...
随机推荐
- idea15 生成mybatis代码
pom.xml <build> <finalName>mybatis_generator</finalName> <plugins> <plugi ...
- ajax的基础
去年也是这个时候,开始学了ajax,也是这个技术领我走上了网页制作的道路,于是这样感觉到手写html比之前的dw拖拖拽拽要有意思得多. 话不多说,下面是一个例子: 这个是ajax显示页面:index. ...
- spring自动类型转换========Converter和PropertyEditor
Spring有两种自动类型转换器,一种是Converter,一种是propertyEditor. 两者的区别:Converter是类型转换成类型,Editor:从string类型转换为其他类型. 从某 ...
- c++四舍五入的新方法
将原来的数加上0.5,如果是需要进位的加上0.5就进位了,如果不需要进位的加上0.5也小于1,被int型省略掉.
- sqlserver中的CHARINDEX用法
CHARINDEX作用 写SQL语句我们经常需要判断一个字符串中是否包含另一个字符串,但是SQL SERVER中并没有像C#提供了Contains函数,不过SQL SERVER中提供了一个叫CHAEI ...
- 算法工程师A
美团点评2017校招笔试真题-算法工程师A 美团点评2017校招笔试真题-算法工程师A 1.下面哪种STL容器的实现和其它三个不一样 A. set B. deque C. multimap D. ...
- 2018.11.01 洛谷P3953 逛公园(最短路+dp)
传送门 设f[i][j]f[i][j]f[i][j]表示跟最短路差值为iii当前在点jjj的方案数. in[i][j]in[i][j]in[i][j]表示在被选择的集合当中. 大力记忆化搜索就行了. ...
- java 判断对象是否是某个类的类型两种方法
第一种: instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: resul ...
- IntelliJ IDEA 2017版 spring-boot搭建拦截器
1.建立一个springboot-web项目 https://www.cnblogs.com/liuyangfirst/p/8298588.html 2.加入过滤接口 public class Log ...
- 第19章:MongoDB-聚合操作--聚合管道--$limit+$skip
①$limit “$limit”:负责数据的取出个数: “$skip”:数据的跨过个数. ②范例:使用“$limit”设置取出的个数