剑指Offer——替换空格

本文介绍了三种在Java中将StringBuffer中的空格替换为%20的方法。第一种是逐字符检查并替换,第二种利用StringBuffer提高效率,第三种采用正则表达式简化操作。

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

题目链接

https://www.nowcoder.com/practice/4060ac7e3e404ad1a894ef3e17650423?tpId=13&tqId=11155&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

 

题目

 

函数接口

 

题解

该题的思路比较浅显,也容易实现。核心思路就是遍历StringBuffer的每个字符,遇到空格就进行替换。对于实现编码应该没有太多的优化空间。

本文在这里给出三种解决方式。

 

方法一

方法一最为简单,也是最容易想到和实现的。

1.声明一个String字符串,然后使用for循环+charAt(index)依次遍历传入的StringBuffer的每一个字符。

2.在每次循环中进行判断。如果当前字符为空格,那么就在字符串中连接一个“%20”;若当前字符不为空格,那么就将当前字符连接进去。

3.最后返回替换完成的String字符串。

下面给出基于这一思路的Java代码

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	String newstr = "";
	for(int i=0;i <str.length();i++){
            newstr += str.charAt(i)==' '?"%20":str.charAt(i);
	}
	return newstr;
    }
}

注:步骤2中可以使用if-else语句,这里为了减少代码量使用了条件运算符。

 

方法二

显然方法一是正确的,同时由于String字符具有初始化空值(不是null)。所以即使StringBuffer长度为0,也一样能保证最后回传的字符串是非空的,保证了鲁棒性。

但需要注意的是方法一中进行字符连接时采用的是直接拼接,这就为程序运行带来了许多不必要的开销。

因为Java在运行期每次进行字符串拼接时,实际上是在底层创建了一个StirngBuilder,然后调用append方法进行拼接。

同时由于每次拼接都会new 一个StringBuilder,且只使用一次就废弃。当这个StringBuffer足够大时,就必然会在堆中开辟大量无用的内存空间。从而为JVM带来许多不必要的开销。

为了解决这个问题,就需要用另一个载体来存放newstr。本文中使用的StringBuffer,但其实单机情况下使用StringBuilder效率更高。但为了未来可能的扩展和复用,这里选用了线程安全的StringBuffer。

代码如下

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	StringBuffer newstr = new StringBuffer();
	for(int i=0;i <str.length();i++){
	    newstr.append(str.charAt(i)==' '?"%20":str.charAt(i));
	}
	return newstr.toString();
    }
}

需要注意的是,因为牛客网提供的函数接口返回值为String,所以不能直接返回newstr,应当进行toString。

 

方法三

以上两种方法其实可以看作同一种方法。但在笔试时,大可以使用JDK提供的API。本文中使用了String类的replaceAll()方法进行替换。

代码如下

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	return str.toString().replaceAll(" ","%20"); 
    }
}

这里可以使用两种方法。在这里简单说明一下两种方法的区别。

replace()和replaceAll()的方法头如下:

public String (char oldChar, char newChar)

public String replaceAll(String regex,String replacement)

这两种方法都能完成字符串的All Replace,主要区别在于其参数。
replace的两个参数都可以为cha或CharSequence,CharSequence是字符串序列,实际上就是字符串。所以replace支持单个字符和字符串的替换。

而replaceAll的参数一是正则表达式,参数二是用于替换的字符串。也即将一个字符串中符合正则规则的串都替换为replacement参数所存的字符串。由于正则表达式的功能性更强,考虑到未来可能的扩展。所以本文中采用了replaceAll()方法。

最后,需要注意的是,这两种方法都不会改变源字符串,预期的字符串通过返回值返回。所以程序中最后return的应该是replaceAll()的返回值,而不是源字符串str。

 

以上三种方法是笔者目前想到的较为合理的方法,都能够通过测试。如果有其他更为优化的方法,欢迎在评论区分享。

资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 DAO Jet 数据库引擎是微软早期开发的用于操作 Access 数据库的组件,与 Jet 引擎紧密相连。Jet 引擎是 Windows 操作系统内置的数据库管理系统,主要支持 Access 数据库及其他使用 Jet 数据存储格式的应用程序。DAO(数据访问对象)是与 Jet 引擎搭配的数据访问接口,能让程序员利用对象和方法操作数据库。当出现“无法初始化 DAO/Jet 数据库引擎”的问题时,通常是由于 DAO 或 Jet 引擎组件损坏、丢失或版本不兼容引起的,这可能是系统更新、病毒入侵、卸载不当或其他软件冲突所致。解决办法之一是从 VC6 光盘中提取相关文件重新安装 DAO Jet 数据库引擎。DAO 接口包含多种类和接口,如 Database、Recordset、Field 等,开发者可借助这些对象执行 SQL 查询、创建和修改表、索引及查询等操作。与 ADO(ActiveX 数据对象)相比,DAO 功能稍弱,但因更贴近底层的 Jet 引擎,在处理 Access 特定特性时可能更便捷。安装 DAO Jet 数据库引擎一般包括以下步骤:下载包含所有必要 DAO 组件的 DAO-REDIST 文件;运行安装程序,按向导提示操作;安装时系统会自动检测并修复 DAO 组件问题或安装缺失组件;安装完成后,可能需重启计算机使更改生效;之后可通过编写简单 VBA 代码测试数据库连接,验证 DAO 是否正常工作。需注意,DAO Jet 数据库引擎主要适用于旧系统和应用程序,新版本的 Microsoft Office 和 Windows 操作系统不再推荐使用 DAO,而是更倾向于采用 ADO 接口以及 SQL Server Express 等更安全、更强大的数据库管理系统。不过,对于依赖 DAO 技
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值