数据结构与算法-剑指Offer系列(4)替换空格-Java实现

43 篇文章 0 订阅
40 篇文章 0 订阅

处理字符串的问题

题目4:替换空格

题目描述:

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

算法思想:

1、如果 从前往后,每次扫描到一个空格,替换为%20的话,那么每次替换后数组都要往后移位(O(n^2));

2、先遍历一次数组,统计出字符串中的空格总数,每替换一个空格,长度增加2,因此替换后的字符串的长度等于原来长度加上2乘以空格数目,所有字符只移动一次,时间复杂度O(n)。

代码实现

package swordToOffer;

public class Num4_ReplaceBlank {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StringBuffer s = null;
		String result = RepalceBlank(s);
		System.out.println(result);
		StringBuffer s1 = new StringBuffer("ab2s4");
		result = RepalceBlank(s1);
		System.out.println(result);
		StringBuffer s2 = new StringBuffer("a b45 dd");
		result = RepalceBlank(s2);
		System.out.println(result);
		StringBuffer s3 = new StringBuffer("");
		result = RepalceBlank(s3);
		System.out.println(result);
	}

	//StringBuffer---线程安全   StringBuilder---非线程安全       长度可变 
	public static String RepalceBlank(StringBuffer str) {
		if(str==null) {
			System.out.println("input is null");
			return null;
		}
		
		int originalLength = str.length();
		int numberOfBlank = 0;
		//int i=0;
		for(int i=0;i<str.length();i++) {
			//originalLength++;
			if(str.charAt(i)==' ') {
				numberOfBlank++;
			}
		}
		
		int newLength = originalLength+numberOfBlank*2;
		//if(newLength==str.length()) return str.toString();
		str.setLength(newLength);
		int indexOfOriginal = originalLength-1;//会出现溢出
		int indexOfNew = newLength-1;//
		
		while(indexOfOriginal>=0&&indexOfNew>indexOfOriginal) {
			if(str.charAt(indexOfOriginal)==' ') {
				str.setCharAt(indexOfNew--, '0');
				str.setCharAt(indexOfNew--, '2');
				str.setCharAt(indexOfNew--, '%');
			}else {
				str.setCharAt(indexOfNew--,str.charAt(indexOfOriginal));
			}
			indexOfOriginal--;
		}
		return str.toString();
	}
}

输出结果:

input is null
null
ab2s4
a%20b45%20dd

分析:

如果遇到在进行数据替换或者需要移动多次时,可以考虑从后向前移动,从而减小移动次数

时间复杂度O(n) 空间复杂度O(1)

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值