如何不使用内置方法实现字符串的反转、替换与删除操作?能否不借助charAt()方法完成该需求?
如何不使用
charAt()实现指定的字符串操作 很棒的问题!你之前用charAt()加异常捕获来判断字符串结束的思路其实非常巧妙——完全避开了调用length()这类内置方法,完美贴合了“不使用内置方法”的要求。下面我们来拆解几种完全不用charAt()的实现方案,具体可以根据面试官对“内置方法”的严格程度来选择:
方案1:使用字符数组(面试场景最实用)
如果面试官说的“不使用内置方法”指的是不能用replace()、reverse()、trim()这类直接完成需求的工具方法(而非禁用所有String类方法),那么把字符串转成char[]数组是最直接且安全的方式,这样可以直接遍历数组访问字符,无需charAt():
String input = "This is an interview"; char target = 't'; char replacement = 'z'; char space = ' '; String finalOutput = ""; // 将字符串转为字符数组(使用toCharArray(),属于String的基础方法) char[] charArray = input.toCharArray(); // 反向遍历数组,一次完成反转、替换和空格删除操作 for (int i = charArray.length - 1; i >= 0; i--) { char currentChar = charArray[i]; if (currentChar == target) { finalOutput += replacement; } else if (currentChar != space) { finalOutput += currentChar; } } System.out.println(finalOutput);
这个方案和你的原始代码逻辑一致,只是用数组访问替代了charAt(),一次循环就完成了所有要求的操作。
方案2:使用反射(应对严格的“禁用所有内置方法”要求)
如果面试官严格要求禁用所有String类方法(包括toCharArray()),那可以用反射来访问String类底层的字符存储。不过要注意,这种方式依赖Java的内部实现(比如Java 9之后String底层在某些场景下用字节数组替代了字符数组),更偏向于“技巧性”而非生产级实现,但能体现你对Java底层的理解:
import java.lang.reflect.Field; public class StringHandler { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { String input = "This is an interview"; char target = 't'; char replacement = 'z'; char space = ' '; String finalOutput = ""; // 通过反射访问String类的私有成员value Field valueField = String.class.getDeclaredField("value"); valueField.setAccessible(true); char[] charArray = (char[]) valueField.get(input); // 和方案1一样处理数组 for (int i = charArray.length - 1; i >= 0; i--) { char currentChar = charArray[i]; if (currentChar == target) { finalOutput += replacement; } else if (currentChar != space) { finalOutput += currentChar; } } System.out.println(finalOutput); } }
如果在面试中使用这个方案,一定要说明它的局限性:跨Java版本可能不兼容,并且破坏了封装性。
对你原始代码的小点评
你用异常捕获来判断字符串结束的思路真的很有创意——大部分人第一反应会用length(),这说明你善于跳出常规思维。就算你继续用charAt()的方案,也是完全符合要求的优秀解法。
内容的提问来源于stack exchange,提问作者Jagadish Dabbiru
相关产品推荐
相关产品推荐

