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

时间:2014-06-07 04:35:47

标签: java

我所说的问题是this

问题陈述:

返回给定字符串的一个版本,对于字符串中的每个星号(*),星号和它左右的字符都消失了。所以“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;
}

14 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:2)

我认为对这个问题使用正则表达式和模式匹配会很简单

public String starOut(String str) {
  String pattern = "([a-zA-Z0-9]{0,1})\\*+([a-zA-Z0-9]{0,1})";
  str = str.replaceAll(pattern, "");
  return str;
}

答案 2 :(得分:1)

这就是我提出的

public String starOut(String str)
{
  boolean lastIsStar = false;
  String result = "";
  for(int i = 0; i < str.length(); i++)
  {
     char c = str.charAt(i);
     if(lastIsStar)
     {
        if(c != '*')
        {
            lastIsStar = false;
        }
     }
     else if(c == '*')
     {
        lastIsStar = true;
        if(i-1 > -1)
        {
           result = result.substring(0, result.length()-1);
        }
     }
     else
     {
        result += c;
        lastIsStar = false;
     }
  }
  return result;
}

答案 3 :(得分:1)

一个小时后写下这个......还是不喜欢它

String result = "";
boolean toDelete = false;
boolean deleted = true;

for(int i=0; i < str.length(); i++){
   if (str.charAt(i) != '*'){
       if(toDelete == false) result += str.charAt(i);
       toDelete = false;
       deleted = false;
       continue;
   }
   if(deleted == false){
      result = result.substring(0,result.length()-1);
      deleted = true;
   }

   toDelete = true;      
}

return result.toString();

答案 4 :(得分:1)

简单有效。 if可以与||结合使用但这看起来更干净。

public String starOut(String str) {

  int i = 0 ;
  for (int i = 0; i <str.length(); i++) {

    if (str.charAt(i) == '*') continue;
    if (i+1<str.length() && str.charAt(i+1) =='*') continue;
    if (i>0 && str.charAt(i-1) !='*') continue;
    ret += str.charAt(i);
  }  
  return ret;  

}

答案 5 :(得分:1)

这是我写的解决方案。它使用1个循环。

public String starOut(String str)
{
    String ret = "";
    for (int i = 0; i < str.length(); i++)
    {        
        if (!( '*' == str.charAt(i) 
        || i + 1 < str.length() && '*' == str.charAt(i+1)
        || i > 0 && '*' == str.charAt(i-1) ))
        {
            ret = ret + str.charAt(i);
        }        
    }
    return ret;
}

答案 6 :(得分:1)

这是一个基于Andrew答案的略微修改的代码:

public String starOut(String str) {
    String pattern = "([^*]{0,1})\\*+([^*]{0,1})";
    return str.replaceAll(pattern, "");
}

答案 7 :(得分:1)

这是我的解决方法-

  public String starOut(String str) {
boolean prevWasStar = false;
String ans = "";
for (int i=0; i<str.length();i++){
  int l = ans.length();
    if (str.charAt(i)=='*'){
        if (!prevWasStar){
          if(i==0) l = l+1;
            ans=ans.substring(0, l-1);
        } 
        prevWasStar=true;
} else{
  if(!prevWasStar) ans = ans + str.charAt(i);
  prevWasStar = false;
}
}return ans;
}

答案 8 :(得分:0)

这是我的代码:

public String starOut(String str) {
  String result = "";
  for (int i=0; i<str.length(); i++) {
    if (!(str.substring(Math.max(0, i-1), Math.min(str.length(), i+2)).contains("*"))) result += str.charAt(i);
  }
  return result;
}

答案 9 :(得分:0)

虽然这篇文章太旧了,已经有很多好的答案,而且由于我花了很多时间在这个练习背后,我还想通过提供我的答案来做出贡献。

public String starOut(String str) 
{
  String b = "";
  if(str.length() == 1 && !str.equals("*"))
  {
    b = str;
  }
  for(int i=0; i<str.length()-1;i++)
  {
     if(str.charAt(i) != '*' && str.charAt(i+1) != '*')
     {
        b = b + str.charAt(i);
     }
     if(str.charAt(i) == '*' && str.charAt(i+1) != '*')
     {
        i = i+1;
     }
  }
  if(str.length() > 1 && str.charAt(str.length()-2) != '*' && str.charAt(str.length()-1) != '*')
  {
    b = b + str.substring(str.length()-1);
  }
  return b;
}

答案 10 :(得分:0)

export default class DayNames extends Component {
  constructor(props) {
    super(props);
    this.state = {
      isToggleOn: true
    };
  }

  handleClick = e => {
    this.setState(prevState => ({
      isToggleOn: { ...prevState.isToggleOn, [e]: !prevState.isToggleOn[e] }
    }));
  };

  render() {
    //Getting number of days of month
    const month = new Date().getMonth() + 1;
    const year = new Date().getFullYear();
    const numberDaysOfMonth = new Date(year, month, 0).getDate();

    let foo1 = [];
    for (let i = 1; i <= numberDaysOfMonth; i++) {
      foo1.push(i);
    }

    let foo2 = ["Ops1", "Ops2", "Ops3", "Ops4", "Ops5", "Ops6"];
    const ops = foo2.map((elem, index) => {
      return (
        <div className="ops_header" key={index}>
          {elem}
          {foo1.map((cell, i) => {
            return (
              <div
                className="operator"
                data-id={cell}
                key={i}
                onClick={() => this.handleClick(i)}
              >
                {this.state.isToggleOn[i] ? "Holiday" : cell}
              </div>
            );
          })}
        </div>
      );
    });

    return (
      <div>
        <div className="table">{ops}</div>
      </div>
    );
  }
}

答案 11 :(得分:0)

这是我的解决方法...

public String starOut(String str) {
  String result = "";
  int i = 0;
  
  while(i<str.length()){
    if(i==0 && str.charAt(i)!='*') result = result + str.charAt(i);
    
    if(i>0 && str.charAt(i-1)!='*' && str.charAt(i)!='*'){
      result = result + str.charAt(i);
    } 
    if(i>0 && str.charAt(i)=='*' && str.charAt(i-1)!='*'){
      result = result.substring(0, result.length()-1);
    }

    i++;
  }
  
  return result;
  
}

答案 12 :(得分:0)

如果先反转条件检查,则可以减少代码行数。

public static String starOut(String str) {
    String answer = "";
    for (int i = 0; i < str.length(); i++) {
        if (!((i > 0 && str.charAt(i - 1) == '*') ||
                (str.charAt(i) == '*') ||
                (i < str.length() - 1 && str.charAt(i + 1) == '*'))) {
            answer += str.charAt(i);
        }
    }
    return answer;
}

答案 13 :(得分:-1)

您可以在startOut方法中使用正则表达式来完成要求。

public static String starOut(String str) {
   return str.replaceAll ( ".?[/*]+.?", "");
}

正则表达式的说明:

表达式开头和结尾的.?匹配任何单个字符(如果它位于行的开头或结尾,则不匹配)。表达式中间的[/*]+与一颗或多颗恒星匹配。