3

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

如果给定字符串包含“xyz”的外观,其中 xyz 没有直接以句点 (.) 开头,则返回 true。所以“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")

我怎样才能让它通过所有测试?

4

21 回答 21

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;
}
于 2013-04-08T19:55:47.980 回答
3

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

return str.replace(".xyz", "").contains("xyz");
于 2016-07-28T21:10:42.567 回答
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"));
}
于 2013-04-08T19:56:05.797 回答
1

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

@EnTHuSiAsTx94

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

String replace(CharSequence target, CharSequence replacement)

稍微注意一下,if 语句中的第一个条件可以简化为:

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

到:

!str.contains(".xyz")

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

于 2013-04-08T20:24:00.010 回答
1
public boolean xyzThere(String str) {
return str.startsWith("xyz") || str.matches(".*[^.]xyz.*");
}
于 2013-12-20T03:48:02.407 回答
1

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

def xyz_there(str):
  pres = str.count('xyz')
  abs = str.count('.xyz')
  if pres>abs:
    return True
  else:
    return False
于 2019-10-29T10:50:03.400 回答
1

下面的代码对我来说很好:

if '.xyz' in str:
  return xyz_there(str.replace('.xyz',''))
elif 'xyz' in str:
  return True

return False
于 2021-08-29T15:44:00.053 回答
0

好的,让我们将您的问题转换为正则表达式:

^从字符串的开头开始,
(|.*[^\.])后跟任何字符或任何数量的任何字符和任何字符,除了.
xyz然后 xyz

Java代码:

public static boolean xyzThere(String str) {
    return str.matches("^(|.*[^\\.])xyz");
}
于 2013-04-08T20:20:05.290 回答
0
boolean flag = false;
if(str.length()<=3){
   flag = str.contains("xyz"); 
}

for (int i = 0; i < str.length()-3; i++) {
    if (!str.substring(i, i+3).equals("xyz") && 
            str.substring(i, i+4).equals(".xyz")) {
        flag=false;
    }else{
        if(str.contains("xyz")) flag=true;
    }
}
return flag;
于 2015-09-11T06:37:07.057 回答
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;
}
于 2017-12-29T01:01:26.883 回答
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;
    }
}
于 2019-02-06T12:17:18.887 回答
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
于 2019-06-21T09:58:36.440 回答
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;
}
于 2019-08-17T12:02:03.590 回答
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;
}
于 2020-05-17T15:14:00.207 回答
0

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

def xyz_there(str):
  for i in range(len(str)):
    if str[i-1]!= '.' and str[i:i+3]=='xyz' :
      return True
  return False
于 2020-08-02T13:02:24.583 回答
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;
}
于 2020-09-28T09:59:06.700 回答
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
于 2021-05-01T04:02:50.337 回答
0

def xyz_there(str):

如果 str 中的“.xxyz”:

return'.xxyz' in str

如果 '。' 在字符串中:

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

return 'xyz' in a

如果 '。' 不在str中:

return 'xyz' in str
于 2021-07-08T13:44:05.197 回答
-1

简单的解决方案,只需替换并检查“xyz”就可以了

def xyz_there(str):
   a=str.replace('.xyz','')
   return 'xyz' in a
于 2019-06-15T17:13:56.830 回答
-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:]

'''

于 2020-01-08T17:50:08.317 回答
-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

于 2020-04-13T14:55:57.110 回答