為什么當我使用包含在 java 串列中的方法時,當我匹配字串時不回傳 true?
我在 HackerEarth 做一個練習,但我無法通過測驗。這是練習的文本:
阿帕斯蘭被襲擊者包圍。一輛卡車進城。司機聲稱裝載的是伊朗人的食品和藥品。阿里是阿帕斯蘭的士兵之一。他懷疑這輛卡車,也許是因為圍城。他知道如果標簽的每兩個連續數字之和為偶數且其字母不是元音,則該標簽是有效的。確定卡車的標簽是否有效。
我們認為字母“A”、“E”、“I”、“O”、“U”、“Y”是這個問題的元音。
輸入格式
第一行包含一個長度為 9 的字串。格式為“DDXDDD-DD”,其中 D 代表數字(非零),X 是大寫英文字母。
輸出格式
如果標簽有效,列印“valid”(不帶引號),否則列印“invalid”(不帶引號)
import java.util.*;
class TestClass {
public static void main(String args[] ) throws Exception {
Scanner s = new Scanner(System.in);
// Write your code here
int sum = 0;
boolean flagIsNotVowel = false;
boolean flagIsEven = false;
String word = s.nextLine();
System.out.println(word);
List<String> dic = new ArrayList();
dic.add("A");
dic.add("E");
dic.add("I");
dic.add("O");
dic.add("U");
dic.add("Y");
System.out.println()
for(int i =0;i<word.length();i ){
boolean flag = Character.isDigit(word.charAt(i));
if(flag) {
sum =Integer.parseInt(word.charAt(i) "");
flagIsEven = sum%2==0 ? true : false;
}
if(!flag && !dic.contains(word.charAt(i) ){
System.out.println(word.charAt(i) "letter");
System.out.println(dic.contains(word.charAt(i)) "true");
sum = 0;
flagIsNotVowel = true;
}
if(!flag && dic.contains(word.charAt(i))){
System.out.println(word.charAt(i) "ciao da dic");
sum = 0;
flagIsNotVowel = false;
}
}
if(flagIsEven ==true && flagIsNotVowel == true){
System.out.println("valid");
}
else{
System.out.println("invalid");
}
}}
這是我無法通過的一項測驗:13A357-22
uj5u.com熱心網友回復:
如果允許在此任務中使用正則運算式,則可能會建議以下解決方案(與@Cary Swoveland的解決方案有些相似)并進行一些更改:
驗證標簽的格式為
DDXDDD-DD,其中D是非零數字,X是輔音
這可以使用正向前瞻來完成:
(?=[1-9]{2}[B-Z&&[^EIOUY]][1-9]{3}-[1-9]{2})
其中[B-Z&&[^EIOUY]]是B-Z除元音之外的大寫字母范圍[^EIOUY](A不包括)檢查數字對不包含奇數和偶數的混合:
public static String isValid(String str) {
return str.matches("(?=[1-9]{2}[B-Z&&[^EIOUY]][1-9]{3}-[1-9]{2})((?!.*(?:[2468][13579]|[13579][2468]))\\d{2,3}[-B-Z&&[^EIOUY]]?){3}")
? "valid"
: "invalid";
}
檢查兩個連續數字之和是否為偶數可以實作如下:
public static String isValid(String str) {
boolean hasValidFormat = str.matches("\\[1-9]][B-Z&&[^EIOUY]][1-9]{3}-[1-9]{2}");
if (hasValidFormat) {
out: for (String part : str.split("\\D")) {
int firstDigit = Character.getNumericValue(part.charAt(0));
for (int i = 1; i < part.length(); i ) {
int digit = Character.getNumericValue(part.charAt(i));
if ((digit firstDigit) % 2 != 0) {
hasValidFormat = false;
break out;
}
}
}
}
return hasValidFormat ? "valid" : "invalid";
}
測驗:
List<String> data = Arrays.asList("13A357-22", "22X468-19", "222F444K555");
for (String test : data) {
System.out.println(test " " isValid(test));
}
輸出:
13A357-22 invalid
22X468-19 valid
222F444K555 invalid
uj5u.com熱心網友回復:
該測驗的問題在于該字母是元音。您的代碼在處理A字符時正確設定 flagIsNotVowel為false.
但是,稍后您處理的-字符與任何其他非數字字符沒有什么不同。-不是元音,因此您的代碼現在設定flagIsNotVowel為 true。
當角色是破折號時,您絕對不需要做任何事情;如果破折號導致您設定flagIsNotVowel任何內容,則您的代碼將不再正確。
請注意,這continue;將結束回圈處理并立即跳到下一次迭代。這可能很有用。
uj5u.com熱心網友回復:
我知道標簽由九個字符組成,第三個是大寫字母,第七個是連字符,其余七個都是非零數字。
當且僅當它與以下正則運算式匹配時,該標簽才有效:
^(?!.*(?:[2468][13579]|[13579][2468]))[1-9]{2}[B-DF-HJ-NP-TV-XZ][1-9]{3}-[1-9]{2}$
演示
觀察到兩個非零數字的和是偶數,并且只有兩個數字都是偶數或兩個數字都是奇數。
這個運算式可以分解如下。
^ # match the beginning of the string
(?! # begin a negative lookahead
.* # match zero or more characters
(?: # begin a non-capture group
[2468][13579] # match an non-zero digit followed by an odd digit
| # or
[13579][2468] # match an odd digit followed by a non-zero even digit
) # end non-capture group
) # end the negative lookahead
[1-9]{2} # match two digits
[B-DF-HJ-NP-TV-XZ] # match a capital letter that is a consonant
[1-9]{3} # match three digits
- # match a hyphen
[1-9]{2} # match two digits
$ # match the end of the string
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/435775.html
下一篇:MergeSort實作越界
