本文参考自《剑指offer》一书,代码采用Java语言。

 更多:《剑指Offer》Java实现合集

题目

  请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。

思路

  首先要询问面试官是新建一个字符串还是在原有的字符串上修改,本题要求在原有字符串上进行修改。

  若从前往后依次替换,在每次遇到空格字符时,都需要移动后面O(n)个字符,对于含有O(n)个空格字符的字符串而言,总的时间效率为O(n2)。

  转变思路:先计算出需要的总长度,然后从后往前进行复制和替换,,则每个字符只需要复制一次即可。时间效率为O(n)。

测试用例

  1.字符串中无空格

  2.字符串中含有空格(连续空格,空格在首尾等)

  3.字符串为空字符串或者为null

完整Java代码

1.根据牛客网的编程练习参考,方法的输入为StringBuffer(String无法改变长度,所以采用StringBuffer),输出为String。 

  主程序中,可以利用 StringBuffer sBuffer = new StringBuffer(str); 来获得字符串的StringBuffer。

2.代码中包含测试代码

/**
*
* @Description 替换空格
*
* @author yongh
* @date 2018年7月18日 上午11:25:52
*/ // 题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,
// 则输出“We%20are%20happy.”。 public class ReplaceSpaces { /**
* 实现空格的替换
*/
public String replaceSpace(StringBuffer str) {
if (str == null) {
System.out.println("输入错误!");
return null;
}
int length = str.length();
int indexOfOriginal = length-1;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == ' ')
length += 2;
}
str.setLength(length);
int indexOfNew = length-1;
while (indexOfNew > indexOfOriginal) {
if (str.charAt(indexOfOriginal) != ' ') {
str.setCharAt(indexOfNew--, str.charAt(indexOfOriginal));
} else {
str.setCharAt(indexOfNew--, '0');
str.setCharAt(indexOfNew--, '2');
str.setCharAt(indexOfNew--, '%');
}
indexOfOriginal--;
}
return str.toString();
} // ==================================测试代码================================== /**
* 输入为null
*/
public void test1() {
System.out.print("Test1:");
StringBuffer sBuffer = null;
String s = replaceSpace(sBuffer);
System.out.println(s);
} /**
* 输入为空字符串
*/
public void test2() {
System.out.print("Test2:");
StringBuffer sBuffer = new StringBuffer("");
String s = replaceSpace(sBuffer);
System.out.println(s);
} /**
* 输入字符串无空格
*/
public void test3() {
System.out.print("Test3:");
StringBuffer sBuffer = new StringBuffer("abc");
String s = replaceSpace(sBuffer);
System.out.println(s);
} /**
* 输入字符串为首尾空格,中间连续空格
*/
public void test4() {
System.out.print("Test4:");
StringBuffer sBuffer = new StringBuffer(" a b c ");
String s = replaceSpace(sBuffer);
System.out.println(s);
} public static void main(String[] args) {
ReplaceSpaces rs = new ReplaceSpaces();
rs.test1();
rs.test2();
rs.test3();
rs.test4();
}
}

  

Test1:输入错误!
null
Test2:
Test3:abc
Test4:%20a%20b%%20c%%

ReplaceSpaces

收获:如果在从前往后进行复制时,需要多次移动数据,则可以考虑从后往前复制,从而减小移动次数,提高效率。

更多:《剑指Offer》Java实现合集

【Java】 剑指offer(4) 替换空格的更多相关文章

  1. 《剑指offer》替换空格

    本题来自<剑指offer> 替换空格 题目: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are% ...

  2. 菜鸟刷题路:剑指 Offer 05. 替换空格

    剑指 Offer 05. 替换空格 class Solution { public String replaceSpace(String s) { StringBuilder str = new St ...

  3. 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串

    第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...

  4. 剑指offer——03替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.   注意事项: <剑指o ...

  5. Go语言实现:【剑指offer】替换空格

    该题目来源于牛客网<剑指offer>专题. 请实现一个函数,将一个字符串中的每个空格替换成"%20". 例如,当字符串为We Are Happy.则经过替换之后的字符串 ...

  6. 剑指offer:替换空格

    题目描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 思路: 一开始没理解,函数中 ...

  7. 剑指Offer 2. 替换空格 (字符串)

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 题目地址 https://ww ...

  8. 【剑指offer】替换空格

    一.题目: 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 二.思路: Python代码,先 ...

  9. 剑指offer之 替换空格

    package Problem4; public class ReplaceBank { /* * 题目描述: 请实现一个函数,将字符串的每个空格替换为"%20". * 例如输入& ...

随机推荐

  1. sql工具和手工注入总结

    普通注入: 数字注入 字符注入 base64注入:和常规的方法没有说明区别,主要是解码然后编码: 如果普通注入不行,尝试大小写绕过,编码等绕过: 如果不行尝试盲注: POST注入 0x00 常用的 注 ...

  2. charCodeAt() 和charAt()

    charAt() 方法可返回指定位置的字符. charCodeAt() 方法可返回指定位置的字符的 Unicode 编码.这个返回值是 0 - 65535 之间的整数. 方法 charCodeAt() ...

  3. luogu P1437 [HNOI2004]尻♂砖块

    传送门 想明白了其实不难 强行瞎扯 这题的限制比较烦,导致了一行行转移几乎不能做(吧) 那么一列列转移呢? 设\(f_{i,j,k}\)表示前\(i\)列,取\(j\)个,其中第\(i\)列取从上往下 ...

  4. POJ 1035 Spell checker (模拟)

    题目链接 Description You, as a member of a development team for a new spell checking program, are to wri ...

  5. Android NetworkInterface 的 name

    user@android:/$ ls /sys/class/net/ dummy0 lo p2p0 rev_rmnet0 rev_rmnet1 rev_rmnet2 rev_rmnet3 rmnet0 ...

  6. bootstrap-table插件数据加载方式

    data-url 直接使用data-url在table标签中定义 使用load方法加载数据 $(“#finishingTask”).bootstrapTable(‘load’,data); //dat ...

  7. python set()、len()、type()、保留小数、EOFError

    1.集合set() set()存的数据为不重复的,可以用此来过滤重复的元素.可以用&求两个set的交集 c = a&b,用|求两个set的并集 c = a | b 用for i in ...

  8. Jetson tk1 hash sum mismatch

    sudo apt-get update遭遇Hash Sum Mismatch 修改DNS服务器地址: sudo gedit /etc/resolv.conf 解决办法: 在装有goagent的情况下: ...

  9. phantomjs 中如何使用xpath

    function getNodeInfo(inputcsvPath) { var htmlnodeInfo = page.evaluate(function () { //_Ltg var XPATH ...

  10. python用win32pdh模块查看进程信息

    import win32pdh def get_processes(): win32pdh.EnumObjects(None, None, win32pdh.PERF_DETAIL_WIZARD) # ...