当前位置: 代码迷 >> J2SE >> [面试题]只替换字符串中延续出现2次的地方
  详细解决方案

[面试题]只替换字符串中延续出现2次的地方

热度:430   发布时间:2016-04-23 19:52:47.0
[面试题]只替换字符串中连续出现2次的地方
现在要把字符串中连续出现2个a的替换成bb

admin => admin 不替换,只出现一次
aaadmin => aaadmin 不替换,a连续出现了3次
aadmin => bbdmin 替换了
aadminaaadminaaaadmin => bbdminaaadminaaaadmin 第一个a出现了2次,被替换了,后面的出现次数不是2,没有替换

public String howReplace(String str)
{

}

------解决思路----------------------

public String howReplace(String str)
{
    String regex = "(?<!a)aa(?!a)";
    return str.replaceAll(regex, "bb");
}

------解决思路----------------------
楼上的正则表达式还没看懂,真是大神级的。
------解决思路----------------------
package test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class Test {
public static void main(String[] args) {
System.out.println(replaceAll("aadminaaadminaaaadaaminaa"));
}

public static String replaceAll(String str) {
try {
Pattern regex = Pattern.compile("(?<!a)aa(?!a)", Pattern.MULTILINE);
Matcher regexMatcher = regex.matcher(str);
return regexMatcher.replaceAll("bb");
} catch (PatternSyntaxException ex) {
throw ex;
}
}
}

------解决思路----------------------
原来是非捕获组。
不过是面试的话,不用正则表达式,有一个简单的思路,扫描母串,扫到a字符,计入下标,并开始计数,往后没联系遇到一个'a',计数加1,知道遇到不为a为之。此时如果计数为2则替换。


string solve(char s[]) {
    int i = 0;
    while (s[i]) {
        while (s[i] && s[i] != 'a') i++;
        if (!s[i]) break;
        int cnt = 0, j = i;
        while (s[j] && s[j] == 'a') {
            j++;
            cnt++;
        }
        if (cnt == 2) {
            for (int k = i; k < j; k++) s[k] = 'b';
        }
        i = j;
    }
    return s;
}

------解决思路----------------------
为什么不换种思路,先把aaa换成#,再换aa为bb,最后将#换回aaa。
不过这个具有局限性。
------解决思路----------------------
应该不难吧,说一下思路吧:
弄一个计数器,遍历整个字符串,此处转成数组,如果当前位置为a,计数器+1,如果不为a则判断是否为2,
表示这之前的两个位置都是a,如果是则将当前位置的前两个位置替换成b,并把计数器清零,
如果不为2,表示有一个或者多个连续a出现,此时也需要把计数器清零。

String str = "afaaauaaaabaacc";
char[] arr = str.toCharArray();// 将字符串转成对应的数组
int count = 0;
for (int i = 0; i < arr.length; i++) {
if ('a'== arr[i]) {
count = count + 1;
} else if (count == 2) {
arr[i] = 'b';
arr[i - 1] = 'b';
count = 0;
} else {
count = 0;
}
}
System.out.println(Arrays.toString(arr));


------解决思路----------------------
本人Java菜鸟一枚,写的有点笨,勿喷!!!

package howplace;

import java.util.Arrays;
import java.util.Scanner;

public class howPlace {
public static void main(String[] args)
{
String s;
howPlace  h = new howPlace();
Scanner scanner = new Scanner(System.in);
s = scanner.next();
//System.out.println(s.length());
h.toPlace(s);
}
private void toPlace(String str)
{
int i = 1;
String str2 = "";
char[] a = str.toCharArray();
while(i < str.length())
{
char isA = a[i];
    char isA2 = a[i-1];
    if (  isA =='a' && isA2 == 'a')
    {
     a[i] = 'b';
     a[i-1] = 'b';
    }
    else
       i++;
}
for (int j = 0; j < a.length; j++)
{
str2 += a[j];
}
System.out.println(str2);
}
}

------解决思路----------------------
就是说前面不是a.   那是正则环视, lz可以参考这篇博客,  java的用法可以参考java api中的正则表达式.或者在线文档
------解决思路----------------------

public static String howReplace(String str)
{
char[] ch = str.toCharArray();
     for( int i=0; i<ch.length; ++i){
     if( ch[i] =='a' ){
     int j = i;
     while( i<ch.length && ch[i]=='a' ){
     i++;
     }
     if( i-j == 2 ){
     ch[j] = 'b';
     ch[j+1] = 'b';
     }
     }
     }
     return new String(ch);
}

试试这个
  相关解决方案