2013-04-08 53 views
2

我試圖解決這個問題CodingBat(。)如果給定的字符串包含在XYZ不是直接由一段preceeded「XYZ」的外觀如果字符串cointains「xyz」前面沒有句點,返回true?

,則返回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") 

我怎樣才能讓它通過所有測試?

+1

你爲什麼要使用'for'循環,完全無視'i'?對於字符串中的每個字符,你都會一遍又一遍地重複同樣的事情。什麼_should_'xyzThere(「abc.xyzxyz」)'返回? – 2013-04-08 19:53:59

+0

你提到的測試用例的結果應該是什麼?它通過與否? – nommyravian 2013-04-08 19:55:57

+0

根據你的哲學傾向,回答'xyzThere(「abc.xyzxyz」)'可能是'true'或'false',除非問題指出是否只檢查第一次出現的'xyz' /'。xyz'。另外,不要使用'str.contains(「。xyz」)== false',而是使用'!str.contains(「。xyz」)'。並且,放下'for'循環。 – 2013-04-08 19:55:58

回答

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")); 
} 
+0

這與我所做的有什麼不同,我的好先生? – 2013-04-08 20:00:09

+0

不,事情是你的代碼返回與我的輸出相同的輸出,即返回false爲xyzThere(「abc.xyzxyz」),但是,它應該返回true。 – 2013-04-08 20:04:39

+0

啊,呃。我會相應地編輯我的答案。新的答案將刪除「.xyz」的所有實例,然後返回字符串的真實情況仍包含「xyz」 – 2013-04-08 20:05:52

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

好吧,讓我們你的問題轉化爲正則表達式:

^從字符串的開頭
(|.*[^\.])後跟任何字符或任何數量的任何字符以及除之外的任何字符
xyz然後XYZ

Java代碼:

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

如果你有正則表達式的錘子,每個問題看起來像一個釘子。除[[(HT | X)ML'](http://stackoverflow.com/a/1732454/845414) – 2013-04-08 20:22:06

+0

爲什麼你不只是使用負面後顧? '「(?<!\\。)xyz」' – 2013-04-08 20:28:52

+0

也有可能,但沒有必要。但可能更好(解釋)。 – 2013-04-08 20:34:47

1

好吧,我知道每個人都渴望分享他們的專業知識,但直送孩子的回答沒有一點好處。

@ EnTHuSiAsTx94

我能夠通過所有的測試用三句話。這裏是一個提示:嘗試使用字符串replace方法。下面是該方法的簽名:

String replace(CharSequence target, CharSequence replacement) 

在一個小紙條,在第一個條件的if語句可以簡化爲:

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

到:

!str.contains(".xyz") 

contains方法已經返回true或false,所以不需要顯式的等號比較。

1
public boolean xyzThere(String str) { 
return str.startsWith("xyz") || str.matches(".*[^.]xyz.*"); 
} 
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; 
0

或者,你可以取代的「名爲.xyz」所有出現的‘字符串’,然後使用。載有方法來驗證修改後的字符串中仍含有‘XYZ’。像這樣:

return str.replace(".xyz", "").contains("xyz"); 
-1
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; 
} 
+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/18376696) – Mamun 2017-12-29 02:08:18

+0

那麼這個確實會運行所有的測試用例。在評論和無知地投票之前先做測試。 – 2017-12-29 18:49:36

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; 
} 
相關問題