[剑指Offer]替换空格及其拓展

本文介绍了如何在原地替换字符串中的空字符为%20,并详细解释了将两个已排序数组合并为一个有序数组的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述


请实现一个函数,把字符串中的空格替换为“%20”,在原来的字符串上做替换,时间复杂度为O(n)。


拓展:
有两个排序数组A1和A2,内存在A1的末尾有足够多的空间容纳A2,请实现一个函数将A2插入的A1中,最终A1仍是排序的。

解题思路


替换空格

我们考虑从后往前进行替换:
  1. 首先遍历原字符串,找出字符串的长度以及其中的空格数量;
  2. 根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度;
  3. 设置两个指针p1和p2分别指向原字符串和新字符串的末尾位置;
  4. 如果p1指向内容不为空格,那么将内容赋值给p2指向的位置,如果p1指向为空格,那么从p2开始赋值“02%”;
  5. 直到循环条件归0(更优的:p1==p2)时表明字符串中的所有空格都已经替换完毕;
示例过程如下:



拓展题
         和替换空格思路类似,从新的尾部开始填充两个数组尾部较大的数,直到遍历完成。

代码

替换空格
public static char[] replaceBlank(char[] str,int length) {
		if(str==null || str.length==0)
			return str;

		int tailIndex = length - 1;
		for(int i = 0;i < length;i++){
			if(str[i]==' '){
				tailIndex += 2;
			}
		}
		
		for(int i = length - 1;i >= 0 && tailIndex!=i;i--){
			if(str[i]!=' '){
				str[tailIndex--] = str[i];
			} else {
				str[tailIndex--] = '0';
				str[tailIndex--] = '2';
				str[tailIndex--] = '%';
			}
		}
		return str;
	}

合并数组
public static int[] mergeSortArrays(int[] A,int lenA,int[] B,int lenB){
		if(B==null || lenB==0)
			return A;
		
		//当A中无数时,或者A的最大值小于B的最小值,直接将B复制到A的尾部
		if(lenA==0 || B[0] > A[lenA - 1]){
			for(int i = 0;i < lenB;i++){
				A[i+lenA] = B[i];
			}
			return A;
		}
		
		int indexA = lenA - 1;
		int indexB = lenB - 1;
		for(int i = lenA+lenB - 1;i >=0;i--){
			if(indexA >=0 && indexB >=0){
				if(A[indexA] > B[indexB]){
					A[i] = A[indexA];
					indexA--;
				} else {
					A[i] = B[indexB];
					indexB--;
				}
			} else if(indexA < 0){
				A[i] = B[indexB--];
			} else if(indexB < 0){
				A[i] = A[indexA--];
			}
			
		}
		
		return A;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值