剑指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;
	}
}
相关推荐
liu_chunhai5 分钟前
设计模式(3)builder
java·开发语言·设计模式
姜学迁13 分钟前
Rust-枚举
开发语言·后端·rust
冷白白14 分钟前
【C++】C++对象初探及友元
c语言·开发语言·c++·算法
凌云行者18 分钟前
rust的迭代器方法——collect
开发语言·rust
It'sMyGo22 分钟前
Javascript数组研究09_Array.prototype[Symbol.unscopables]
开发语言·javascript·原型模式
睡觉然后上课32 分钟前
c基础面试题
c语言·开发语言·c++·面试
一叶祇秋35 分钟前
Leetcode - 周赛417
算法·leetcode·职场和发展
qing_04060339 分钟前
C++——继承
开发语言·c++·继承
武昌库里写JAVA40 分钟前
【Java】Java面试题笔试
c语言·开发语言·数据结构·算法·二维数组
ya888g41 分钟前
GESP C++四级样题卷
java·c++·算法