面试题:将字符串反转的8种方法,你能想到几种?

简介: 面试题:将字符串反转的8种方法,你能想到几种?

面试中,经常会遇到这样的问题,给定字符串“abc123”,你能够想到几种方式将该字符串进行反转,得到“321cba”?

本文就带大家展示几种常见的字符串反转的方法。

准备知识

在学习字符串反转的方法之前,先了解几个背景知识点:

  • String类被final修饰,是不可变的;
  • String类并未提供reverse()方法,但StringBuilder/StringBuffer提供了reverse()方法;
  • StringBuilder没有toCharArray()方法,但String有toCharArray()方法。
  • String提供了charAt方法,可以获得指定索引位置的char值。

字符串转换为字节数组

通过getBytes()方法将字符串转换为byte[]数组。基本思路:创建一个临时数组,数组长度与字符串长度一样;倒序遍历通过字符串获得的字节数组,存放到临时数组中。最后将数组转换为String字符串。

@Test
public void bytesReverse() {
    String input = "GeeksforGeeks";
    byte[] strAsByteArray = input.getBytes();
    byte[] result = new byte[strAsByteArray.length];
    // 倒序存储字字节数组中的内容到临时字节数组中
    for (int i = 0; i < strAsByteArray.length; i++) {
        result[i] = strAsByteArray[strAsByteArray.length - i - 1];
    }
    System.out.println(new String(result));
}

这种方式的缺点也很明显,当字符串为中文、日韩等语言时,反转之后基本都是无意义的乱码了。

通过StringBuilder的reverse()方法

String字符串没有reverse()方法,因此可以将字符串构建为StringBuilder或StringBuffer,利用StringBuilder的reverse()方法来进行字符串的反转。

@Test
public void stringBuilderReverse(){
    StringBuilder sb = new StringBuilder("程序新视界");
    System.out.println(sb.reverse().toString());
}

StringBuilder的reverse()方法对中文也能够很好的进行反转。StringBuffer的使用与StringBuilder一致,不再赘述。

字符串转换为char数组

首先转换字符串为char数组,然后倒序打印或拼接char中的数据即可。

@Test
public void string2CharReverse(){
    String input = "程序新视界";
    char[] try1 = input.toCharArray();
    for (int i = try1.length - 1; i >= 0; i--) {
        System.out.print(try1[i]);
    }
}

上面的方式是直接倒序打印,针对获得的char数组拼接新字符串还可以通过双向指针的方式将char数组中的字符直接互换位置。

@Test
public void string2CharChangeReverse(){
 String input = "程序新视界";
 char[] tempArray = input.toCharArray();
 int right = tempArray.length - 1;
 for (int left = 0; left < right; left++, right--) {
  // 左右值进行交换
  char temp = tempArray[left];
  tempArray[left] = tempArray[right];
  tempArray[right] = temp;
 }
 for (char c : tempArray) {
  System.out.print(c);
 }
}

交换的算法很简单,指定左右指针的起始位置分别为0和length-1,然后进行左右位置的交换。完成交换之后left加一,right减一,再次交换,直到不再满足left小于right的条件。

当获得char数组之后,还可以利用List和Collections对字符进行反转操作。

@Test
public void string2CharListReverse(){
 String input = "程序新视界";
 char[] hello = input.toCharArray();
 List<Character> trial1 = new ArrayList<>();
 for (char c : hello) {
  trial1.add(c);
 }
 Collections.reverse(trial1);
 for (Character character : trial1) {
  System.out.print(character);
 }
}

首先同样将字符串转换为char数组,然后将数组里的每一项都放入List当中,通过集合工具类Collections的reverse方法对List进行反转。

我们还可以通过栈的先进后出特性来对char数组中的字符进行倒序处理:

@Test
public void string2Stack() {
 String str = "程序新视界";
 Stack<Character> s = new Stack<>();
 for(int i = 0;i<str.length();i++) {
  // 入栈
  s.add(str.charAt(i));
 }
 StringBuffer sb = new StringBuffer();
 for(int i = 0;i<str.length();i++) {
  // 出栈
  sb.append(s.pop());
 }
 System.out.println(sb);
}

通过charAt方法

String提供了charAt方法,可以用来检索特定索引下的字符。charAt()方法返回指定索引位置的char值。索引范围为0~length()-1,chartAt()中的括号只能传int类型的参数。

@Test
public void string2CharAt() {
 String str = "程序新视界";
 for (int i = str.length() - 1; i >= 0; i--) {
  System.out.print(str.charAt(i));
 }
}

利用递归

通过递归的方式来达到字符串的反转:

//递归
public static String reverse5(String str) {
 int len = str.length();
 if (len <= 1) {
  return str;
 }
 String left = str.substring(0, len / 2);
 String right = str.substring(len / 2, len);
 return reverse5(right) + reverse5(left);
}

小结

上面总结了8字符串翻转的方法,但并未完全覆盖,比如还可以通过Apache commons-lang3中提供的StringUtils.reverse方法进行字符串的反转等。

面试中出这道题最主要考虑的就是你的知识面及活学活用的程度。同时,你可能已经看到一些算法和数据结构的身影在里面。


目录
相关文章
|
4月前
|
人工智能 前端开发 Java
Java 面试资料中相关代码使用方法与组件封装方法解析
这是一份详尽的Java面试资料代码指南,涵盖使用方法与组件封装技巧。内容包括环境准备(JDK 8+、Maven/Gradle)、核心类示例(问题管理、学习进度跟踪)、Web应用部署(Spring Boot、前端框架)、单元测试及API封装。通过问题库管理、数据访问组件、学习进度服务和REST接口等模块化设计,帮助开发者高效组织与复用功能,同时支持扩展如用户认证、AI推荐等功能。适用于Java核心技术学习与面试备考,提升编程与设计能力。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
107 6
Java 面试资料中相关代码使用方法与组件封装方法解析
|
6月前
|
人工智能 算法 数据库
美团面试:LLM大模型存在哪些问题?RAG 优化有哪些方法?_
美团面试:LLM大模型存在哪些问题?RAG 优化有哪些方法?_
|
9月前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
351 9
|
9月前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
362 12
|
10月前
|
缓存 安全 Java
【JavaEE】——单例模式引起的多线程安全问题:“饿汉/懒汉”模式,及解决思路和方法(面试高频)
单例模式下,“饿汉模式”,“懒汉模式”,单例模式下引起的线程安全问题,解锁思路和解决方法
|
11月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
406 4
【Java基础面试二十】、介绍一下Object类中的方法
这篇文章介绍了Java中Object类的常用方法,包括`getClass()`、`equals()`、`hashCode()`、`toString()`、`wait()`、`notify()`、`notifyAll()`和`clone()`,并提到了不推荐使用的`finalize()`方法。
【Java基础面试二十】、介绍一下Object类中的方法
|
Java API 索引
【Java基础面试二十四】、String类有哪些方法?
这篇文章列举了Java中String类的常用方法,如`charAt()`、`substring()`、`split()`、`trim()`、`indexOf()`、`lastIndexOf()`、`startsWith()`、`endsWith()`、`toUpperCase()`、`toLowerCase()`、`replaceFirst()`和`replaceAll()`,并建议面试时展示对这些方法的熟悉度,同时深入理解部分方法的源码实现。
【Java基础面试二十四】、String类有哪些方法?
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
240 2
【Java集合类面试三十】、BlockingQueue中有哪些方法,为什么这样设计?
BlockingQueue设计了四组不同行为方式的方法用于插入、移除和检查元素,以适应不同的业务场景,包括抛异常、返回特定值、阻塞等待和超时等待,以实现高效的线程间通信。