编码的有效解决方案在Java中谜语starOut

Ani*_*udh 1 java

我说的问题是这个

问题陈述:

返回给定字符串的一个版本,对于字符串中的每个星号(*),星号和其左右两侧的字符都消失了.所以"ab*cd"产生"ad"和"ab**cd"也产生"ad".

starOut("ab*cd")→"ad"

starOut("ab**cd")→"ad"

starOut("sm*eilly")→"傻"

我得到的解决方案有点乱,我使用了大约6个if语句和处理一个特定情况,寻找更简洁的ifs更清晰的解决方案.

请不要使用超过1个循环和集合或正则表达式.

以下是我的解决方案:

public String starOut(String str) {
  String result="";
  boolean currentFlag=false;

  if(str.length()==0)
  return result;

  for(int i=0;i+1<str.length();i++)
  {
    if(str.charAt(i)=='*')
    {
       i+=1;
       currentFlag=true;
       continue;
     }
     if(str.charAt(i+1)=='*')
     {
        i+=2;
        continue;
     }
     if((i>0)&&str.charAt(i-1)=='*')
     {
        continue;
     }
     result+=str.substring(i,i+1);
     currentFlag=false;

   }

  if(!(currentFlag)&&(str.length()==3)&&(str.charAt(1)=='*'))
      return ""; 

   if((str.charAt(str.length()-1)!='*')&!(currentFlag))
     return result+=str.charAt(str.length()-1);
    else
      return result;
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*sen 6

伪代码:

逐步浏览字符串中的所有字符.如果您使用星号,请勿记录.偷看,如果你看到一个星号,不要记录它.如果看到星号,请向右看,不要记录.如果上述情况均未发生,请记录下来.

Java代码:

public static String starOut(String s) {
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) == '*') continue;
        if (i > 0 && s.charAt(i - 1) == '*') continue;
        if (i < s.length() - 1 && s.charAt(i + 1) == '*') continue;

        sb.append(s.charAt(i));
    }

    return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)

  • @DaveS`charAt()`导致直接访问字符串的底层字符数组.即便如此,将其分配给变量也会消除一些函数调用,并可能使事情稍微快一些.调用字符串的`length()`方法也是如此. (2认同)