1. 前言

最近面试了几家公司,体验了一下电话面试和今年刚火起来的视频面试

虽然之前就有一些公司会先通过电话面试的形式先评估下候选人的能力水平,但好像不多,至少我以前的面试形式100%都是现场面试

面试过程中,不可避免的被问到了很多面试题,本篇博客就总结下面试过程中被问到的关于String的2道面试题,分别是:

  1. 如何判断一个字符串中某个字符出现的次数?
  2. 如何反转一个字符串?

其余的面试题,目前都已梳理出来,后续会以博客的形式进行分享。

2. 如何判断一个字符串中某个字符出现的次数?

在直接问这个问题之前,面试官先问了我下面这个问题:

请说一下String常用的方法有哪些?

该问题其实是考察Java基础,毕竟String类在平时的开发中使用非常广泛,我当时主要说了以下方法:

  1. length
  2. equals
  3. trim
  4. substring
  5. concat
  6. indexOf
  7. lastIndexOf
  8. replace
  9. split
  10. toLowerCase
  11. toUpperCase

以上只是面试时我想到的一少部分方法,更多String的方法大家可在IDEA中查看源码,毕竟太多了,如下所示:

在回答完上述问题后,面试官紧接着问了该问题:

如何判断一个字符串中某个字符出现的次数?

听到该问题,我脑海中第一反应是先把字符串转换为字符数组,然后使用foreach循环,在循环体内进行字符比对,代码如下所示:

public static void main(String[] args) {
String str = "ABC123ABC";
char searchChar = 'B'; int count = 0;
char[] charArray = str.toCharArray();
for (char item : charArray) {
if (item == searchChar) {
count++;
}
} System.out.println("字符" + searchChar + "出现的次数为:" + count);
}

输出结果如下所示:

字符B出现的次数为:2

但面试题肯定不会这么简单,紧接着面试官增加了限制条件:

如果不能使用循环,只使用String自己的方法,如何实现呢?

实现方法有很多种,但我推荐使用replace()方法,很好理解,并且高效,代码如下所示:

public static void main(String[] args) {
String str = "ABC123ABC";
String searchChar = "B";
int count = 0; int origialLength = str.length();
str = str.replace(searchChar, "");
int newLength = str.length(); count = origialLength - newLength; System.out.println("字符" + searchChar + "出现的次数为:" + count);
}

而且我觉得,关于面试题:如何判断一个字符串中某个字符出现的次数?,上面这个实现方法才是面试官真正想听到的答案。

3. 如何反转一个字符串?

因为是电话面试,在面了1个小时,面试快结束的时候,面试官问了该问题:

怎么让一个字符串反转?说下思路即可

可能很多同学第一时间想到的思路是下面这样的:

public static void main(String[] args) {
String str = "ABC123ABC"; StringBuilder stringBuilder = new StringBuilder(str);
stringBuilder.reverse(); String newStr = stringBuilder.toString(); System.out.println("反转前:" + str);
System.out.println("反转后:" + newStr);
}

但我觉得这肯定不是面试官问这个问题的意图,所以我当时的回答是下面这样的:

可以利用数据结构中的栈,因为栈的特点是先入后出(这里可以提一下和队列的不同,队列的特点是先入先出),先把字符串中的每个字符按顺序入栈,再依次出栈,即可实现字符串的反转。

即入栈顺序是:A B C 1 2 3 A B C

而出栈顺序是:C B A 3 2 1 C B A

转换成Java代码是下面这样的:

public static void main(String[] args) {
String str = "ABC123ABC"; char[] charArray = str.toCharArray();
Stack<Character> stack = new Stack<>();
StringBuilder newStr = new StringBuilder(); for (char item : charArray) {
stack.push(item);
} for (int i = 0; i < charArray.length; i++) {
newStr.append(stack.pop());
} System.out.println("反转前:" + str);
System.out.println("反转后:" + newStr.toString());
}

输出结果如下所示:

反转前:ABC123ABC

反转后:CBA321CBA

4. 感悟

最近的面试,有以下几点感悟:

  1. 电话面试比视频面试靠谱

    视频面试有点尬的感觉,而且有时会卡顿,相比之下电话面试就不会存在这些问题

    个人更喜欢电话面试的形式

  2. 面试前多一些准备

    复工后的第2天,面了第一家公司,完全没状态,答的一塌糊涂

    建议面试前一定要调整好状态,特别是这次春节在家宅的时间有点长,更要调整

  3. 一定要有的放矢

    一定要对你所投递岗位的公司有一定了解,避免面试通过了你又不想去,浪费双方时间

    建议对自己投递的岗位和公司多花点时间去仔细了解下

【Java面试题】关于String,最近被问到了这2道面试题的更多相关文章

  1. 为Java程序员金三银四精心挑选的五十道面试题与答案

    1.面向对象的特征有哪些方面? [基础] 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问 ...

  2. java面试题之----String的intern

    When---什么时候需要了解String的intern方法: 面试的时候(蜜汁尴尬)!虽然不想承认,不过面试的时候经常碰到这种高逼格的问题来考察我们是否真正理解了String的不可变性.String ...

  3. 两道面试题,带你解析Java类加载机制

    文章首发于[博客园-陈树义],点击跳转到原文<两道面试题,带你解析Java类加载机制> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Gr ...

  4. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

  5. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  6. java内存分配和String类型的深度解析

    [尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...

  7. Java中ArrayList相关的5道面试题

    本文参考了 <关于ArrayList的5道面试题 > 1.ArrayList的大小是如何自动增加的? 这个问题我想曾经debug过并且查看过arraylist源码的人都有印象,它的过程是: ...

  8. Java基础知识强化47:StringBuffer类之StringBuffer的三个面试题

    1. 面试题:String,StringBuffer,StringBuilder的区别 ? 答:String是字符串内容不可变的,而StringBuffer和StringBuilder是字符串内容长度 ...

  9. 跟着刚哥梳理java知识点——深入理解String类(九)

    一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class String implements java.io.Ser ...

随机推荐

  1. 计算 $s=1+(1+2)+(1+2+3)+\cdots+(1+2+3+\cdots+n)$

    #include<stdio.h> //编写一个程序,计算 s=1+(1+2)+(1+2+3)+...+(1+2+3+...+n) 的值,要求n从键盘输入. main() { int i, ...

  2. Linux命令:ldd

    1.ldd不是一个可执行程序,而是一个shell脚本. zlf@ubuntu:~/$ which ldd /usr/bin/ldd zlf@ubuntu:~/$ file /usr/bin/ldd / ...

  3. 因为AI,所以爱

    作为技术驱动型公司 自我颠覆的核心就是技术上有所突破 2019技术奇点大会上,创始人行在提出 「未来,大数据和人工智能 将成为商业升级的智能发动机」 这与我们的使命不谋而合 时间退回到2016年的冬天 ...

  4. [LC] 692. Top K Frequent Words

    Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...

  5. 吴裕雄--天生自然python学习笔记:打开文件并显示文件内容

    Win32com 组件打开文件通过 Documents 的 Open 方法,语法为 : 例如,打开上一节创建的 testl . docx 文件 , 文件变量名为 doc: 获得文件内容的方法有两种,第 ...

  6. Linux(Centos7.X ) 配置Java 环境变量

    前提条件:上传Jdk 文件到Linux服务器上. tar -zxvf jdk-8u111-linux-x64.tar.gz 修改 /etc/profile 在打开的文件末尾添加如下内容: export ...

  7. SpringBoot多数据源中的分布式事务

    虽然现在微服务越来越流行,我们的系统随之也拆分出来好多的模块功能.这样做的目的其实就是为了弥补单体架构中存在的不足.随着微服务的拆分,肯定设计到分库分表,但这之中肯定设计到分布式事务.最典型的例子就是 ...

  8. centos7 开机/etc/rc.local 不执行的问题(转载)

    最近发现centos7 的/etc/rc.local不会开机执行,于是认真看了下/etc/rc.local文件内容的就发现了问题的原因了 #!/bin/bash # THIS FILE IS ADDE ...

  9. URL与URI与URN的区别与联系

    1.什么是URL? 统一资源定位符(或称统一资源定位器/定位地址.URL地址等[1],英语:Uniform Resource Locator,常缩写为URL),有时也被俗称为网页地址(网址).如同在网 ...

  10. python Dom

    Dom(Document) 称为:文档对象模型,是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.DOM把网页和脚本以及其他的编程语言联系了起 ...