面试系列第2篇:回文字符串判断的3种方法!

作者 | 磊哥

来源 | Java面试真题解析(ID:aimianshi666)

转载请联系授权(微信ID:GG_Stone)

回文字符串判断是面试和笔试中常见的面试题之一,同时也是 LeetCode 中一道经典的面试题,那么本文我们就来看一下什么是回文字符串?以及如何实现回文字符串的判断。

回文字符串定义

回文字符串是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文字符串。(来自百度百科)

举个例子,比如以下字符串就为回文字符串:

回文字符串判断的3种方法

1、使用内置函数反转判断

回文字符串最简单的实现方式就是将字符串进行反转之后再与原字符串进行判断,假如二者相同的话则证明为回文字符串,我们可以借助 StringBuilder 来实现,实现代码如下:

public class Plalindrome {public static void main(String[] args) {System.out.println(isPlalindrome_1("12321"));System.out.println(isPlalindrome_1("1231"));System.out.println(isPlalindrome_1("123321"));}/*** 借助内置函数反转实现回文字符串判断* @param str 待判断字符串* @return*/private static boolean isPlalindrome_1(String str) {StringBuilder sb = new StringBuilder(str);sb.reverse();return sb.toString().equals(str);}
}

程序的执行结果为:

true

false

true

当然,除了可以使用 StringBuilder 之外,我们也可以使用 StringBuffer 来实现,实现代码都是相同的,我们这里就不再赘述。

2、使用方法循环调用实现

我们可以初始化两个指针 low 和 high,让它们分别指向字符串的第一个字符和最后一个字符,每次判断两个指针指向的字符是否相同,如果相同,则更新指针,是 low = low+1 和 high = high-1,然后判断再进行判断,当所有循环到最中间时二者还相同,则证明是回文字符串,如下图所示:实现代码如下:

public class Plalindrome {public static void main(String[] args) {String str = "12321";String str2 = "1231";String str3 = "123321";System.out.println(isPlalindrome_2(str, 0, str.length() - 1));System.out.println(isPlalindrome_2(str2, 0, str2.length() - 1));System.out.println(isPlalindrome_2(str3, 0, str3.length() - 1));}/*** 用方法循环调用实现* @param str  待对比字符串* @param low  前面字符的下标* @param high 后面字符的下标* @return*/private static boolean isPlalindrome_2(String str, int low, int high) {if (high == 0 || high == 1) {return true;} else {char c1 = str.charAt(low), c2 = str.charAt(high);if (c1 == c2) { // 字符对比相等return isPlalindrome_2(str, low + 1, high - 1);} else { // 字符对比不相等return false;}}}
}

程序的执行结果为:

true

false

true

3、使用 for 循环判断

使用 for 循环判断的方式和上一种实现思路类似,是将字符串分隔成两半,先对比第一位和最后一位是否相等,如果相等进行下一次循环,每次给首位+1 和末尾-1,然后再进行判断,在整个循环过程中如果有一次不相等就里面返回 false,如果整个循环能顺利执行完则说明是回文字符串,直接返回 true 即可,实现代码如下:

public class Plalindrome {public static void main(String[] args) {String str = "12321";String str2 = "1231";String str3 = "123321";System.out.println(isPlalindrome_3(str));System.out.println(isPlalindrome_3(str2));System.out.println(isPlalindrome_3(str3));}/*** 用 for 循环判断* @param str 待对比字符串* @return*/private static boolean isPlalindrome_3(String str) {char[] chars = str.toCharArray();int maxSize = chars.length / 2; // 循环比较次数for (int i = 0; i < maxSize; i++) {if (chars[i] != chars[chars.length - 1 - i]) {// 最前面的和最后的依次对比,如果有一个不相同,则返回 falsereturn false;}}return true;}
}

程序的执行结果为:

true

false

true

当然,除了以上 3 种实现方法之外,我们还可以有更多判断的方法,比如将字符串倒序之后组成一个新的字符串,再将新老字符串进行比较,或者直接使用 StringBuffer 的 reverse 来实现等。

回文字符串判断的意义

回文字符串判断的意义,我能想到的就是“面试”了,因为在实际的生活中真的很难找到它的实际应用,这就好像游戏和玩具对人的“意义”一样,它有什么意义呢?其实“面试”一条也就够了吧。

总结

回文字符串可以使用内置反转字符串或者递归的方式进行对比,但如果是实际的面试中,我推荐使用第 3 种方式来实现,因为它更原始、需要的依赖也更少,我们并不需要借助 JDK 自身的 API 就可以实现,并且它的实现代码也很简单易懂。

你还有更好的解决方案吗?欢迎评论区补充留言~


往期推荐

List 集合去重的 3 种方法

2020-08-17

定时任务最简单的3种实现方法(超好用)

2020-08-18

为什么劝你放弃Maven?看看Gradle的这些优点就知道了

2020-08-19

关注下方二维码,每一天都有干货!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工程中多个不同类型线程池_软件工程中不同类型的设计策略

工程中多个不同类型线程池As we know that the designing phase is probably the second phase in the software development lifecycle, which comes after the feasibility testing and requirement analysis phase. As the name itself defines that in this phase, the sof…

vb检查磁盘类型

Option ExplicitPrivate Declare Function GetDriveType Lib "kernel32.dll" Alias "GetDriveTypeA" (ByVal nDrive As String) As LongPrivate Sub Command1_Click()Select Case GetDriveType("C:\")Case 0MsgBox "未知类型", vbExcl…

Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)...

一、什么是Activity&#xff1f; 简单的说&#xff1a;Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面。在一个应用程序中通常由多个Activity构成&#xff0c;都会在Manifest.xml中指定一个主的Activity&#xff0c;例如以下设置 <actionandroid:name"androi…

将十进制转化为八进制的算法_十进制系统转换为八进制系统

将十进制转化为八进制的算法Converting a number from Decimal to Octal is almost similar to converting Decimal into Binary, although just one difference is that unlike Binary conversion, here in an integral part, we successively divide the number by 8 until t…

阿里为什么推荐使用LongAdder,而不是volatile?

这是我的第 87 篇原创文章作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;阿里《Java开发手册》最新嵩山版在 8.3 日发布&#xff0c;其中有一段内容引起了老王的注意&#…

VC函数中的延时操作

说到程序中的延时&#xff0c;你会想到怎么做&#xff0c;新开一个线程&#xff1f;如果我的程序只用单线程&#xff0c;却又想让函数等上10秒才返回值&#xff0c;而且还不能像使用Sleep函数那样不能处理其它消息呢&#xff1f;我在这里把论坛里能见到的几种延时方式总结一下。…

Eclipse中SVN的安装步骤(两种)和用法

一、给安装EclipseSVN&#xff0c;最常见的有两种方式&#xff1a;手动方式和使用安装向导方式。详细过程例如以下&#xff1a; 方式一&#xff1a;手动安装 1、从官网下载site-1.6.9.zip文件,网址是:subclipse.tigris.org2、从中解压出features与plugins目录&#xff0c;拷贝到…

c构造函数和析构函数_C ++构造函数和析构函数| 查找输出程序| 套装3

c构造函数和析构函数Program 1: 程序1&#xff1a; #include <iostream>using namespace std;class Sample {private:int X;public:Sample(){X 0;}void set(int x){X x;}void print(){cout << X << endl;}};int main(){Sample S[2] { Sample(), Sample()…

XP定时关机

&#xff08;1&#xff09;自己的电脑有时在整理或者下载东西&#xff0c;需要很长时间等待。但是自己因为要休息的原因&#xff0c;不能一直等在电脑弄完后关机。所以这时需要对XP设置定时关机。比如预计这个下载任务完毕后在23:50可以关机&#xff0c;那么点击开始&#xff0…

当当花160买400的书,确定不囤一波?

天空飘来五个字&#xff0c;快要开学啦快快让路 ║ 今天我要去上学喽新学期我决定一定要努力学习没有新书给我充电怎么行&#xff1f;每次买完新书&#xff0c;感觉都是在开一场私人签售会哈哈哈这感觉真不错当当网自营图书大促>> 每满100减50 <<满200减100满300减…

stl取出字符串中的字符_在C ++ STL中使用比较运算符比较两个字符串

stl取出字符串中的字符字符串作为数据类型 (String as datatype) In C, we know string basically a character array terminated by \0. Thus to operate with the string we define character array. But in C, the standard library gives us the facility to use the strin…

万字详解Lambda、Stream和日期

作者&#xff1a;虚无境来源&#xff1a;cnblogs.com/xuwujing/p/10145691.html前言本篇主要讲述是Java中JDK1.8的一些语法特性的使用&#xff0c;主要是Lambda、Stream和LocalDate日期的一些使用。Lambda“Lambda 表达式(lambda expression)是一个匿名函数&#xff0c;Lambda表…

Python 换行符

raw字符串与多行字符串如果一个字符串包含很多需要转义的字符&#xff0c;对每一个字符都进行转义会很麻烦。为了避免这种情况&#xff0c;我们可以在字符串前面加个前缀 r &#xff0c;表示这是一个 raw 字符串&#xff0c;里面的字符就不需要转义了。例如&#xff1a;r\(~_~)…

vb的一些搞怪的操作

VB代码之&#xff1a;鼠标锁option ExplicitPrivate Type RECT Left As Long Top As Long Right As Long Bottom As Long End TypePrivate Declare Function ClipCursor Lib "user32" (lpRect As Any) As LongPrivate Sub Command1_Click()锁定鼠标 Dim r As RECT r.…

给51单片机初学者的建议

凡是diy爱好者都应该知道单片机&#xff0c;用直白的话说他就是单片微型计算机&#xff0c;能进行编程而后实现简单的自动化&#xff0c;智能化。 刚入门的时候&#xff0c;看到一些专业名词简直不知道说的是什么&#xff0c;比如寄存器、定时器、计数器、中断等等&#xff0c…

ai推理_人工智能推理能力问答

ai推理1) Which of the following statements correctly define the concept of Inference in AI? It is the way in which facts and information are stored in the storage system of the agentWhen we conclude the facts and figures to reach a particular decision, th…

Java 中 10 大坑爹功能!

今天我们就来聊一下 Java 中的 10 大坑爹功能&#xff0c;它们分别是&#xff1a;1.switch必须加上break才结束2.逻辑运算符的“短路”现象3.数组下标从零开始4.ArrayList遍历删除时报错5.字符转成数字的坑6.while循环体的“障眼法”7.Integer类有缓存8.空方法体导致死循环9.神…

WinXP下变量方式表达对应路径说明

在一些批处理或者系统技巧操作教程文章中&#xff0c;我们常常会看到一些形如 %windir% 或者 %systemdrive% 的变量。这些变量都代表着什么含义呢&#xff1f;下面西部e网的icech为大家整理了在Windows XP下系统变量方式表达相对应的路径&#xff0c;大家可以看得更加清楚明白了…

js 添加事件 attachEvent 和 addEventListener 的区别

1、addEventListener 适用w3c标准方法addEventListener绑定事件&#xff0c;如下&#xff0c;事件的执行顺序和绑定顺序一致&#xff0c;执行顺序为method1->method2->method3 //element.addEventListener(type,listener,useCapture);btn1Obj.addEventListener("cli…

三种循环及break、continue的区别及用法

循环&#xff0c;就是指某些语句重复多次执行&#xff0c;循环语句就是循环指令&#xff0c;能进入循环就能跳出循环&#xff0c;C语言中用到的循环有while、do…while和for三种&#xff0c;跳出循环语句有break和continue两种&#xff0c;这些语句各有特点。 While&#xff1…