编程语言
首页 > 编程语言> > 不熟悉Java的str.replace()方法引发的面试惨案

不熟悉Java的str.replace()方法引发的面试惨案

作者:互联网

华为面试题,题目描述:

给定一组字符串和一个匹配模式,判断每一个字符串是否与该模式匹配,匹配则记为true,反之记为false,输出匹配结果。

匹配模式描述,对匹配模式中可以插入任意数量的小写字母但不允许插入大写字母能得到给定的字符串,例如:匹配模式为"FB",则可以匹配"aFsfsfBjkj"、"adFBj",但不能匹配"FsdsFsaB";匹配模式为"FoBa",则可以匹配"FooosBauut",不能匹配"FaoBasds"、"FoJJGBasf"(解释:匹配模式中每个大写字母和其后面的小写字母为一个整体,不可分割)

注意:已保证输入的字符串和匹配模式均为大小写字母

 

面试时写出的代码:

package com.test.od;

import java.util.ArrayList;
import java.util.List;

public class OD2 {
    public static boolean[] deal(String[] strs, String partern){
        List<String> parterns = new ArrayList<>();
        boolean[] res = new boolean[strs.length];
//双指针法分割匹配模式
        int ptr1 = 0, ptr2 = 1;
        while (ptr2 < partern.length()){
            if (partern.charAt(ptr2) >= 'A' && partern.charAt(ptr2) <= 'Z'){
                parterns.add(partern.substring(ptr1, ptr2));
                ptr1 = ptr2;
            }
            ptr2++;
        }
        parterns.add(partern.substring(ptr1));
//挨个匹配
        for (int i = 0; i < strs.length; i++){
            res[i] = isContain(strs[i], parterns);
        }
        return res;
    }

    public static boolean isContain(String str,  List<String> patterns){
        for (String pattern : patterns){
//如果不全包含分割后的匹配模式,直接返回失败
            if (!str.contains(pattern)){
                return false;
            }

//!!!!!此处引发惨案!!!! //原因:误以为replace()方法会自动将替换后的值赋值给str //实际并不会,只是返回替换后的结果,所以此处替换相当于无效 //正确的应该是str = str.replaceFirst(pattern, ""); //匹配掉 str.replaceFirst(pattern, ""); } //判断匹配后的字符串是否还包含大写字母 for(char alb = 'A'; alb <= 'Z'; alb++){ if (str.contains(String.valueOf((char)alb))){ return false; } } return true; } public static void main(String[] args) { String[] strs = {"FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"}; String pattern = "FoB"; boolean[] res = deal(strs, pattern); for (boolean r : res){ System.out.println(r); } } }

  

标签:匹配,pattern,ptr2,模式,replace,str,Java,partern
来源: https://www.cnblogs.com/WinterRain/p/16120780.html