面试题:将字符串反转的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());

}

1

2

3

4

5

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方法进行字符串的反转等。


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


面试系列

《面试题:聊聊TCP的粘包、拆包以及解决方案》

《面试题:重写equals方法为什么通常会重写hashcode方法?》

《面试官:如何找出字符串中无重复最长子串?》

《还不懂Java的泛型?只用这一篇文章,保证你面试对答如流》

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



目录
相关文章
|
关系型数据库 MySQL 数据库
数据安全之路:深入了解MySQL的行锁与表锁机制
数据安全之路:深入了解MySQL的行锁与表锁机制
609 1
|
算法 C++ 索引
【C++STL基础入门】string迭代器
【C++STL基础入门】string迭代器
359 1
|
Java 应用服务中间件 开发工具
苍穹外卖》电商实战项目(java)知识点整理(上)
苍穹外卖》电商实战项目(java)知识点整理(上)
950 3
|
Java 开发工具 Docker
最全解决docker配置kibana报错 Kibana server is not ready yet
最全解决docker配置kibana报错 Kibana server is not ready yet
1889 0
|
Shell Linux
Linux Shell 进阶:探索高级命令和脚本编程技巧
Linux Shell不仅仅是一个命令解释器,它还提供了许多强大的高级命令和脚本编程技巧,能够帮助用户更高效地管理系统和处理数据。在这篇文章中,我们将深入探讨Linux Shell的高级功能。
543 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的学籍管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的学籍管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
153 2
|
12月前
|
人工智能 数据可视化 安全
瀑布模型是什么?在软件开发中有哪些主要阶段和步骤?
瀑布模型是一种经典的软件开发方法,将开发过程划分为需求分析、设计、编码、测试和维护等顺序阶段,强调阶段性和文档化。适用于需求明确、稳定且对安全性和可靠性要求高的项目。尽管存在局限性,但在特定场景下仍具重要价值。未来,瀑布模型可能与其他开发模型结合,更加灵活高效。
2276 3
瀑布模型是什么?在软件开发中有哪些主要阶段和步骤?
|
11月前
|
JSON JavaScript Java
如何手写实现 JSON Parser
【11月更文挑战第10天】本文介绍了如何使用 Python 手写实现一个简单的 JSON 解析器。通过逐字符读取 JSON 字符串,解析出对象、数组、字符串、数字、布尔值和 null 等基本数据结构。文章详细描述了每个步骤的具体实现方法,包括去除空白字符、解析基础数据类型、解析字符串、数组和对象,以及核心的 `parse_value` 函数。最后,提供了一个完整的 JSON 解析器主函数示例。
216 2
|
消息中间件 NoSQL Java
2024年高频Java面试题集锦(含答案),让你的面试之路畅通无阻!
或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信你一定不会“败”的很惨,因为有了它,足以应对目前市面上绝大部分的 Java 面试了,因为这篇文章不论是从深度还是广度上来讲,都已经囊括了非常多的知识点了。
|
12月前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?