面试题4. 替换空格

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

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

    public String replaceSpace(StringBuffer str) {
    	return str.toString().replace(" ", "%20");
    }

思路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处分别插入"0"、“2”、"%"即可。

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]

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值