面试题4. 替换空格

来源:互联网 发布:怎么复制筛选后的数据 编辑:程序博客网 时间:2024/06/02 06:33

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

思路1:
new一个新的字符串,并在新的字符串上做操作,最后返回这个新的字符串。
可以使用java中的string replace()方法。

思路2:
在原始字符串上进行替换
在面试时,需要和面试官交流看看他的需求,以及确定选用哪种方案

这里写图片描述

Step1.
遍历一遍字符串”We Are Happy.”,获取空格的个数,以便计算替换后的新字符串的长度。
新字符串的长度等于原长度加上2乘以空格数。。因为我们将空格替换为“%20”相当于比原来一个空格多了两个字符。
本题中,“We Are Happy.”的长度是13,则新字符串“We%20Are%20Happy.”的长度是13 + 2 * 2 = 17


Java中,字符串不以’\0’为结尾。因为Java中的一切都是对象,字符串也是对象,有自己的长度。


Step2.
从后向前开始复制字符串。定义两个变量i、j。
i初始化为输入字符串的结尾,j初始化为扩充后字符串的结尾。
依次将i指向的字符复制到j指向的字符。当i指向的字符为空格时,在j、j-1、j-2处分别插入”%”、”2”、”0”即可。

Java代码如下:
StringBuffer 的setLength()方法,用于设置字符序列的长度。可以扩充原始字符序列的长度。
StringBuffer 的setCharAt(index, ch)方法,可以设置对应位置上的字符。

public class ReplaceSpace {    public String replaceSpace(StringBuffer str) {        int count = 0;        int oldLen = str.length();        for(int i = 0; i < oldLen; i++) {            if(str.charAt(i) == ' ') {                count++;            }        }        // 新字符串的长度等于原长度加上2乘以空格数        int newLen = oldLen + count * 2;        // setLength()方法,用于设置字符序列的长度。可以扩充原始字符序列的长度。        str.setLength(newLen); //扩展字符串              int i = oldLen - 1;        int j = newLen - 1;        while(i < j) {            if(str.charAt(i) != ' ') {                // setCharAt(index, ch)方法,可以设置对应位置上的字符。                str.setCharAt(j, str.charAt(i));                j--;            } else {                str.setCharAt(j--, '0');                str.setCharAt(j--, '2');                str.setCharAt(j--, '%');            }             i--;        }        return str.toString();    }    public static void main(String[] args) {        // TODO Auto-generated method stub        ReplaceSpace r = new ReplaceSpace();        StringBuffer sb = new StringBuffer("We Are Happy.");        String s = r.replaceSpace(sb);        System.out.println(s);    }}

思考题:

有两个排序后的数组A1和A2,在A1末尾有足够多的空间存储A2,请实现一个方法,把A2中的数字插入到A1中。

和这道题的思路一样,从尾开始,依次比较A1和A2中的数字,把大的存储到A1的末尾。这样就避免了多次移动A1中的数字。

java代码如下:

int[] a = {1,3,5,7,0,0,0};int[] b = {2,4,6};int i = 3, j = 2;int p = 6;while(i >= 0 && j >= 0) {    if(a[i] < b[j]) {        a[p--] = b[j--];    }else{        a[p--] = a[i--];    }}System.out.println(Arrays.toString(a)); // [1, 2, 3, 4, 5, 6, 7]

这里写图片描述

原创粉丝点击