Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java编写Bat riddle starOut的有效解决方案_Java_Algorithm - Fatal编程技术网

用Java编写Bat riddle starOut的有效解决方案

用Java编写Bat riddle starOut的有效解决方案,java,algorithm,Java,Algorithm,我说的问题是 问题陈述: 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) == '*') continu

我说的问题是

问题陈述:

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();
}
返回给定字符串的一个版本,其中对于字符串中的每个星号(),其左右两侧的星号和字符都将消失。所以“abcd”产生“ad”,而“ab**cd”也产生“ad”

starOut(“ab*cd”)→ “广告”

starOut(“ab**cd”)→ “广告”

starOut(“sm*eilly”)→ “傻”

我得到的解决方案有点混乱,我使用了大约6个if语句和一个特定案例的处理,寻找具有较小if的更干净的解决方案

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

以下是我的解决方案:

publicstringstarout(stringstr){
字符串结果=”;
布尔currentFlag=false;
如果(str.length()==0)
返回结果;
对于(int i=0;i+10)和&str.charAt(i-1)='*')
{
继续;
}
结果+=str.substring(i,i+1);
currentFlag=false;
}
如果(!(currentFlag)和&(str.length()==3)和&(str.charAt(1)='*'))
返回“”;
if((str.charAt(str.length()-1)!='*')和!(currentFlag))
返回结果+=str.charAt(str.length()-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;
}
publicstringstarout(stringstr)
{
布尔lastIsStar=false;
字符串结果=”;
对于(int i=0;i-1)
{
result=result.substring(0,result.length()-1);
}
}
其他的
{
结果+=c;
lastIsStar=假;
}
}
返回结果;
}

伪代码:

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();
}
单步遍历字符串中的所有字符。如果你降落在星号上,不要记录。向左看,如果看到星号,不要记录。向右看,如果你看到星号,不要记录。如果上述情况均未发生,则记录下来

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();
}
公共静态字符串起始(字符串s){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i0&&s.charAt(i-1)='*')继续;
如果(i


注意:我看到许多答案弹出,它们将
String
对象连接到循环中,而不是使用
StringBuilder
。不要那样做。是的。

一个小时后,我写了这个。。。还是不喜欢

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();
字符串结果=”;
布尔toDelete=false;
布尔删除=真;
对于(int i=0;i
简单有效。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;  

}
publicstringstarout(stringstr){
int i=0;

对于(inti=0;i,这里是我编写的解决方案。它使用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;
}
publicstringstarout(stringstr)
{
字符串ret=“”;
对于(int i=0;i0&&'*'==str.charAt(i-1)))
{
ret=ret+str.charAt(i);
}        
}
返回ret;
}

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

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;
}

这是一个基于Andrew答案的稍加修改的代码:

public String starOut(String str) {
    String pattern = "([^*]{0,1})\\*+([^*]{0,1})";
    return str.replaceAll(pattern, "");
}
这是我的代码:

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;
}
publicstringstarout(stringstr){
字符串结果=”;

对于(int i=0;i虽然这篇文章太老了,已经有很多好的答案,而且由于我花了这么多时间在这个练习上,我也希望通过提供我的答案来做出贡献

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;
}
publicstringstarout(stringstr)
{
字符串b=“”;
如果(str.length()==1&&!str.equals(“*”)
{
b=str;
}
对于(int i=0;i 1&&str.charAt(str.length()-2)!='*'&&str.charAt(str.length()-1)!='*')
{
b=b+str.substring(str.length()-1);
}
返回b;
}

您可以在startOut方法中使用正则表达式来满足需求

public static String starOut(String str) {
   return str.replaceAll ( ".?[/*]+.?", "");
}
正则表达式的解释:

在表达式的开始和结束时,<代码> ./c>匹配任何单个字符(或者在一行的开头或结尾时没有字符)。表达式中的<代码> [/*] +<代码>匹配一个或多个星星。

< p>这里是我的解决方案-< /p>
  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;
}
publicstringstarout(stringstr){
布尔值prevWasStar=false;
字符串ans=“”;
对于(int i=0;i
publicsstringstarout(stringstr)
{
字符串ret=“”;
int i;
if(str.length()==0 | | str.equals(“*”)返回“”;
对于(i=0;str.charAt(i)='*';++i)
;
如果(i>0&&str.charAt(i-1)='*'))
++一,;
而(i
这是我的解决方案

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;
  
}
publicstringstarout(stringstr){
字符串结果=”;
int i=0;
而(i0&&str.charAt(i-1)!='*'&&str.charAt(i)!='*'){
结果=结果+str.charAt(i);
} 
如果(i>0&&str.charAt(i)='*'&&str.charAt(i-1)!='*'){
result=result.substring(0,result.length()-1);
}
i++;
}
返回结果;
}

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

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;
}
公共