剑指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;
	}
}
相关推荐
myjs9993 分钟前
数学=符号
java·前端·算法
程序猿小D31 分钟前
Java项目:基于SSM框架实现的校园活动资讯网管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
java·数据库·mysql·spring·毕业设计·ssm框架·校园活动
张元清34 分钟前
Neant:0心智负担的React状态管理库
前端·javascript·面试
阿华的代码王国36 分钟前
【Android】PopupWindow实现长按菜单
android·xml·java·前端·后端
何其幸40 分钟前
js类型转换的知识点整理
前端·javascript·面试
找不到、了40 分钟前
关于MyBatis 的懒加载(Lazy Loading)机制
java·mybatis
啃火龙果的兔子1 小时前
快速搭建Java服务指南
java·开发语言
未来之窗软件服务1 小时前
智慧收银系统开发进销存库存统计,便利店、水果店、建材与家居行业的库存汇总管理—仙盟创梦IDE
java·开发语言·ide·进销存·仙盟创梦ide·东方仙盟·收银台
pusue_the_sun1 小时前
从零开始搞定类和对象(上)
开发语言·c++
CodeCraft Studio1 小时前
国产化PDF处理控件Spire.PDF教程:Java 提取 PDF 图片,高质量提取与图片过滤技巧
java·python·pdf·国产化·文档处理·spire·pdf图片提取