不熟悉Java的str.replace()方法引发的面试惨案
华为面试题,题目描述:
给定一组字符串和一个匹配模式,判断每一个字符串是否与该模式匹配,匹配则记为true,反之记为false,输出匹配结果。
匹配模式描述,对匹配模式中可以插入任意数量的小写字母但不允许插入大写字母能得到给定的字符串,例如:匹配模式为"FB",则可以匹配"aFsfsfBjkj"、"adFBj",但不能匹配"FsdsFsaB";匹配模式为"FoBa",则可以匹配"FooosBauut",不能匹配"FaoBasds"、"FoJJGBasf"(解释:匹配模式中每个大写字母和其后面的小写字母为一个整体,不可分割)
注意:已保证输入的字符串和匹配模式均为大小写字母
面试时写出的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | <code-pre class = "code-pre" id= "pre-RaNPsi" ><code-line class = "line-numbers-rows" ></code-line> package com.test.od; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> import java.util.ArrayList; <code-line class = "line-numbers-rows" ></code-line> import java.util.List; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> public class OD2 { <code-line class = "line-numbers-rows" ></code-line> public static boolean [] deal(String[] strs, String partern){ <code-line class = "line-numbers-rows" ></code-line> List<String> parterns = new ArrayList<>(); <code-line class = "line-numbers-rows" ></code-line> boolean [] res = new boolean [strs.length]; <code-line class = "line-numbers-rows" ></code-line> //双指针法分割匹配模式 <code-line class = "line-numbers-rows" ></code-line> int ptr1 = 0 , ptr2 = 1 ; <code-line class = "line-numbers-rows" ></code-line> while (ptr2 < partern.length()){ <code-line class = "line-numbers-rows" ></code-line> if (partern.charAt(ptr2) >= 'A' && partern.charAt(ptr2) <= 'Z' ){ <code-line class = "line-numbers-rows" ></code-line> parterns.add(partern.substring(ptr1, ptr2)); <code-line class = "line-numbers-rows" ></code-line> ptr1 = ptr2; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> ptr2++; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> parterns.add(partern.substring(ptr1)); <code-line class = "line-numbers-rows" ></code-line> //挨个匹配 <code-line class = "line-numbers-rows" ></code-line> for ( int i = 0 ; i < strs.length; i++){ <code-line class = "line-numbers-rows" ></code-line> res[i] = isContain(strs[i], parterns); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> return res; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> public static boolean isContain(String str, List<String> patterns){ <code-line class = "line-numbers-rows" ></code-line> for (String pattern : patterns){ <code-line class = "line-numbers-rows" ></code-line> //如果不全包含分割后的匹配模式,直接返回失败 <code-line class = "line-numbers-rows" ></code-line> if (!str.contains(pattern)){ <code-line class = "line-numbers-rows" ></code-line> return false ; <code-line class = "line-numbers-rows" ></code-line> }<br><br> <code-line class = "line-numbers-rows" ></code-line> //!!!!!此处引发惨案!!!! <code-line class = "line-numbers-rows" ></code-line> //原因:误以为replace()方法会自动将替换后的值赋值给str <code-line class = "line-numbers-rows" ></code-line> //实际并不会,只是返回替换后的结果,所以此处替换相当于无效 <code-line class = "line-numbers-rows" ></code-line> //正确的应该是str = str.replaceFirst(pattern, ""); <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> //匹配掉 <code-line class = "line-numbers-rows" ></code-line> str.replaceFirst(pattern, "" ); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> //判断匹配后的字符串是否还包含大写字母 <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> for ( char alb = 'A' ; alb <= 'Z' ; alb++){ <code-line class = "line-numbers-rows" ></code-line> if (str.contains(String.valueOf(( char )alb))){ <code-line class = "line-numbers-rows" ></code-line> return false ; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> return true ; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> public static void main(String[] args) { <code-line class = "line-numbers-rows" ></code-line> String[] strs = { "FooBar" , "FooBarTest" , "FootBall" , "FrameBuffer" , "ForceFeedBack" }; <code-line class = "line-numbers-rows" ></code-line> String pattern = "FoB" ; <code-line class = "line-numbers-rows" ></code-line> boolean [] res = deal(strs, pattern); <code-line class = "line-numbers-rows" ></code-line> for ( boolean r : res){ <code-line class = "line-numbers-rows" ></code-line> System.out.println(r); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line>} </code-pre> |
__EOF__

本文作者:心若向阳,无畏悲伤
本文链接:https://www.cnblogs.com/WinterRain/p/16120780.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/WinterRain/p/16120780.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?