剑指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;
	}
}
相关推荐
技术小结-李爽2 分钟前
【工具】pom文件的<packaging>
java·maven
l1564694826 分钟前
突围!图文混合知识库难以解析,Kimi-K3 原生视觉架构深耕知识工作,DMXAPI 统一接口,缩短项目开发周期
java·大数据·开发语言
啦啦啦啦啦zzzz1 小时前
算法:贪心算法
c++·算法·leetcode·贪心算法
charlie1145141911 小时前
现代C++工程实践 WeakPtr 实战(三):WeakPtrFactory 与「最后成员」惯用法
开发语言·c++·开源项目·现代c++
布吉岛的石头1 小时前
Java 程序员第 45 阶段11:网关统一路由大模型接口,配合 Nacos 配置治理,灰度路由:基于Nacos元数据实现大模型服务灰度发布与权重路由
java·服务发现
我命由我123452 小时前
Android 开发问题:Cannot resolve method ‘repeat‘ in ‘String‘
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
IT小盘2 小时前
04-大模型流式输出原理-SSE与Python实现
开发语言·网络·人工智能·python
我叫黑大帅2 小时前
git 的 NFD 与 NFC 有什么区别?为什么我有个文件在 NFC 中间不会被当成改动,在 NFD 中就会当成改动
git·面试·github
baozhengw2 小时前
信创改造-SpringBootJar包改为WAR包部署Tomcat
java·tomcat
我叫黑大帅2 小时前
add()和 __add__() 写法哪个更好呢?
后端·python·面试