如果字符串包含“xyz”之前没有句点,则返回true?

时间:2013-04-08 19:51:47

标签: java string

我正在尝试解决这个CodingBat问题:

  

如果给定的字符串包含“xyz”的外观,则返回true,其中xyz不直接以句点(。)开头。所以“xxyz”计算但“x.xyz”没有。

xyzThere("abcxyz") → true
xyzThere("abc.xyz") → false
xyzThere("xyz.abc") → true

我的尝试:

public boolean xyzThere(String str) {
  boolean res = false;

  if(str.contains(".xyz") == false && str.contains("xyz")){
    res = true;
  }

  return res;

}

问题是,除了下面的测试之外,它通过了所有测试,因为它包含两个xyz实例:

xyzThere("abc.xyzxyz")

如何让它通过所有测试?

20 个答案:

答案 0 :(得分:4)

public static boolean xyzThere(String str) {
    int i = -1;
    while ((i = str.indexOf("xyz", i + 1 )) != -1) {
        if (i == 0 || (str.charAt(i-1) != '.')) {
            return true;
        }
    }
    return false;
}

答案 1 :(得分:2)

public boolean xyzThere(String str) {
    return(!str.contains(".xyz") && str.contains("xyz"));
}

编辑:鉴于“.xyzxyz”应该返回true,解决方案应该是:

public boolean xyzThere(String str) {
    int index = str.indexOf(".xyz");
    if(index >= 0) {
        return xyzThere(str.substring(0, index)) || xyzThere(str.substring(index + 4));
    } else return (str.contains("xyz"));
}

答案 2 :(得分:1)

好的,我知道每个人都渴望分享他们的专业知识,但直接给孩子答案没什么用。

@ EnTHuSiAsTx94

我能够通过三个语句传递所有测试。这是一个提示:尝试使用字符串replace方法。这是方法签名:

String replace(CharSequence target, CharSequence replacement)

在次要说明中,if语句中的第一个条件可以简化为:

str.contains(".xyz") == false

为:

!str.contains(".xyz")

contains方法已经返回true或false,因此不需要显式的equals比较。

答案 3 :(得分:1)

public boolean xyzThere(String str) {
return str.startsWith("xyz") || str.matches(".*[^.]xyz.*");
}

答案 4 :(得分:1)

或者,您可以替换所有出现的" .xyz"在带有""的字符串中,然后使用.contains方法验证修改后的字符串是否仍包含" xyz"。像这样:

return str.replace(".xyz", "").contains("xyz");

答案 5 :(得分:0)

定义 xyz_there(str):

如果 str 中的“.xxyz”:

return'.xxyz' in str

如果'.'在字符串中:

a=str.replace(".xyz","")

return 'xyz' in a

如果'.'不在 str 中:

return 'xyz' in str

答案 6 :(得分:0)

def xyz_there(str1):
  
  for i in range(len(str1)):
    if str1[i-1] != '.' and str1[i:i+3] == 'xyz':
      return True
  else:
    return False

答案 7 :(得分:0)

 public boolean xyzThere(String str) {

    boolean flag = false;
    
    if (str.startsWith("xyz"))
    {
        return true;
    }

    for (int i = 0; i < str.length() - 3; i++)
    {
                                         
        if (str.charAt(i) != '.' && str.charAt(i + 1) == 'x'
            && str.charAt(i + 2) == 'y' && str.charAt(i + 3) == 'z')
        {
          flag = true;
          break;
        }
    }
    return  flag;
}

答案 8 :(得分:0)

这是用非常简单的逻辑解决此问题的最佳方法和最简单方法:

Function

答案 9 :(得分:0)

public boolean xyzThere(String str) {

    if (str.startsWith("xyz")){
      return true;
    }

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

        if (str.subSequence(i, i + 3).equals("xyz") && !(str.charAt(i-1) == '.')) {
            return true;
        }
    }
    return false;
}

答案 10 :(得分:0)

您可以将等效的Java代码用于以下解决方案:

def xyz_there(str):
  pres = str.count('xyz')
  abs = str.count('.xyz')
  if pres>abs:
    return True
  else:
    return False

答案 11 :(得分:0)

另一种方法

public boolean xyzThere(String str) {
 if(str.startsWith("xyz")) return true;
for(int i=0;i<str.length()-3;i++) {
   if(str.substring(i+1,i+4).equals("xyz") && str.charAt(i)!='.') return true;
}
  return false;
}

答案 12 :(得分:0)

在python中,以下代码有效:

def xyz_there(str):
 if len(str) < 3:
  return False
 for i in range(len(str)):
  if str[i-1]!= '.':
   if str[i:i+3]=='xyz' :
    return True
 else:
  return False

答案 13 :(得分:0)

public class XyzThereDemo {
    public static void main(String[] args) {
        System.out.println(xyzThere("abcxyz"));
        System.out.println(xyzThere("abc.xyz"));
        System.out.println(xyzThere("xyz.abc"));
    }

    public static boolean xyzThere(String str) {
        int xyz = 0;
        for (int i = 0; i < str.length() - 2; i++) {


            if (str.charAt(i) == '.') {
                i++;
                continue;

            }

            String sub = str.substring(i, i + 3);


            if (sub.equals("xyz")) {
                xyz++;
            }


        }

        return xyz != 0;
    }
}

答案 14 :(得分:0)

我这样解决了:

public boolean xyzThere(String str) {

  if (str.length()>=3 && str.substring(0,3).equals("xyz")) {
    return true;
   }

  for (int x=0; x<str.length()-3; x++) {

  if (str.substring(x+1,x+4).equals("xyz") && !str.substring(x,x+1).equals(".")) {
    return true;
   }
 }
 return false;
}

答案 15 :(得分:0)

public boolean xyzThere(String str) {
  boolean res=false;
  if(str.length()<3)res=false;
  if(str.length()==3){
    if(str.equals("xyz"))res=true;
    else res=false;
  }
  if(str.length()>3){
   for(int i=0;i<str.length()-2;i++){
     if(str.charAt(i)=='x' && str.charAt(i+1)=='y' && str.charAt(i+2)=='z'){
       if(i==0 || str.charAt(i-1)!='.')res=true;
     }
   }
  }
  return res;
}

答案 16 :(得分:0)

好的,让我们将您的问题翻译成正则表达式:

^从字符串的开头
开始 (|.*[^\.])后跟任何字符或任何数量的字符以及除.之外的任何字符 xyz然后是xyz

Java代码:

public static boolean xyzThere(String str) {
    return str.matches("^(|.*[^\\.])xyz");
}

答案 17 :(得分:-1)

''''python

def xyz_there(str):

    dot=str.find('.')    # if period is present in str if not dot==-1
    if dot==-1:            # if yes dot will show position of period  
        return 'xyz' in str
    elif dot!=-1:                 #if period is present at position dot
        if 'xyz' in str[:dot]:    
            return True                    
        while str[dot+1:].find('.')!=-1:   #while another period is present 
            if  '.xyz' in str[dot+1:]==False:  # .xyz will not be counted  
                return True
        else:
            dot=dot+str[dot+1:].find('.')+2 #now dot=previous dot+new dot+2
    else:
        return 'xyz' in str[dot+2:]

'''

答案 18 :(得分:-1)

def xyz_there(str):
  list = [i for i in range(len(str)) if str.startswith('xyz', i)]
  if list == []:
    return False
  else:
    found = 0
    for l in list:
      if str[l-1:l+3] != ".xyz":
        found += 1
    if found >=1:
      return True
    else:
      return False

答案 19 :(得分:-1)

简单的解决方案,只需替换并在多数民众赞成中检查“ xyz”

def xyz_there(str):
   a=str.replace('.xyz','')
   return 'xyz' in a