剑指offer面试题4 替换空格

考察点

java 复制代码
考察数据结构字符串

知识点

java 复制代码
不同于c语言,java语言有字符和字符串俩种数据类型,char类型(字符类型)是基本数据类型,string类型(字符串类型)是引用类型
java语言中的字符采用unicode编码在内存中用2个字节存储,因此一个英文字符或者中文字符的数据类型都可以是char。要显示字符对应的编码,直接将char类型赋值给int类型即可
java语言有专门的string类型,字符串在内存中的存储形式是一个字符数组,且最后一个字符不是以'\0'结尾。c语言没有专门的string类型,c语言中要想表示字符串的话就要么通过以'\0'结尾的字符数组要么通过字符指针
String类型的变量一旦创建,它引用的对象的内容就不能被修改了,重新赋值变量修改的其实是变量的指向
字符串连接:直接用+号
String testVariable = "hello " + "world";
字符串的遍历:
for (int i = 0;i < testVariable;i++) {
	System.out.println(testVariable.charAt(i));
} 
字符串与字符数组的转换:
char[] testVariablea = testVariable.toCharArray();
String testVariableb = String.valueOf(testVariablea);

题目

分析:

关于字符串的考点无非就是字符串的遍历以及关于字符串类型本身提供的方法,后者其实主要考察你对语言本身是否足够熟悉,比如java语言中String类型支持哪些方法,这个太具体了,不太符合对抽象的数据结构和算法的考察标准。因此思路还是要往提升时间或者空间复杂度的点上靠。题目中要求把所有的空格换成"%20",从前往后依次遍历,每遇到一个空格该空格后面的字符都需要往后面腾挪,如果有n个空格的话时间复杂度也能达到O(n^2),该如何提升遍历的效率?这个时候一定要聚焦于数据结构自身的特性,观察字符串本身,遍历方式无非就是从前往后,或者从后往前,第一个方案不行那就考虑第二个方案,从后往前遍历一定要清楚字符串的总的大小,这样才能保证后面的字符不会被覆盖掉。如果我们能把字符串中空格的数目算出来,这样总的字符数目也就清楚了。

(如果直接用java语言提供的能力的话,String类型本身支持replaceAll方法)

java 复制代码
import java.util.Arrays;

public class Four {
	public static void main(String[] args) {
		char chara[] = new char[0];
		replaceBlank(chara,0);
		System.out.println(Arrays.toString(chara));
		char charb[] = new char[5];
		charb[0] = 'a';
		charb[1] = 'b';
		charb[2] = 'c';
		charb[3] = ' ';
		replaceBlank(charb,4);
		System.out.println(new String(charb));
		char charc[] = new char[14];
		charc[0] = ' ';
		charc[1] = 'b';
		charc[2] = 'c';
		charc[4] = ' ';
		charc[5] = 'd';
		charc[6] = ' ';
		charc[7] = 'e';
		replaceBlank(charc,7);
		System.out.println(new String(charc));

	}
	public static void replaceBlank(char[] charString,int length) {
		if (charString == null || charString.length <= 0 || length <= 0) {
			return;
		}
		int blankCount = 0;
		for (int i = 0; i< length; i++) {
			if (charString[i] == ' ') {
				blankCount++;
			}
		}
		int newLength = length + blankCount * 2;
		if (newLength  > charString.length) {
			return;
		}
		int newLengthIdx = newLength -1;
		int lengthIdx = length - 1;
		while (lengthIdx >= 0 && newLengthIdx > lengthIdx) {
			if (charString[lengthIdx] == ' ') {
				charString[newLengthIdx--] = '0';
				charString[newLengthIdx--] = '2';
				charString[newLengthIdx--] = '%';
			} else {
				charString[newLengthIdx--] = charString[lengthIdx];
			}
			lengthIdx--;
		}
		return;
	}
}
相关推荐
碧蓝的水壶5 分钟前
数据转换过程
java·开发语言·windows
2501_947575806 小时前
计算机毕业设计之jsp开山车行二手车交易系统
java·开发语言·hadoop·python·信息可视化·django·课程设计
骑士雄师6 小时前
java面试题 4:鉴权
java·开发语言
芝士爱知识a6 小时前
AI 模拟面试怎么做:智蛙公考智能体多轮对话 + 实时追问的工程实现
面试·职场和发展
时间的拾荒人7 小时前
C语言字符函数与字符串函数完全指南
c语言·开发语言
帅次7 小时前
Android 高级工程师面试:Java 基础知识 近1年高频追问 22 题
android·java·面试
蓝胖的四次元口袋7 小时前
Java集合(4)
java·哈希算法
2501_948106918 小时前
计算机毕业设计之基于jsp教科研信息共享系统
java·开发语言·信息可视化·spark·课程设计
TanYYF8 小时前
spring ai入门教程二
java·人工智能·spring
SeeYa-J8 小时前
Spring IOC(Inversion of Control)
java·spring·rpc