Nói rằng bạn có một chuỗi như thế này:
abaabbbbbaabba
Đếm số lần mà một ký tự được chỉ định xuất hiện trong chuỗi đầu vào, nhưng chỉ khi ký tự đó chỉ xuất hiện một lần trong một hàng . Ví dụ: nếu nhân vật là a
,
abaabbbbbaabba
^ x x ^
Tổng cộng sẽ là 2 ( aa
sẽ không được tính vì a
xuất hiện hai lần liên tiếp).
Làm thế nào điều này có liên quan đến FizzBuzz?
Nếu ký tự xuất hiện 3 (hoặc bội số của 3) lần liên tiếp hoặc 5 (hoặc bội số của 5) lần liên tiếp, thay vào đó bộ đếm sẽ giảm dần . Nếu nó là bội số của cả 3 và 5 lần, bộ đếm vẫn tăng. Hãy nhớ rằng bộ đếm cũng được tăng lên nếu nhân vật chỉ xuất hiện một lần liên tiếp và nó sẽ bị bỏ qua nếu nhân vật xuất hiện bất kỳ số lần nào khác liên tiếp (bên cạnh các tình huống được mô tả ở trên).
Để tóm tắt lại, nếu chuỗi phù hợp là a
,
input counter (explanation)
a 1 (single occurence)
aaa -1(multiple of 3)
aaaaa -1(multiple of 5)
aaaaaaaaaaaaaaa 1 (multiple of 15)
aa 0 (none of the above)
aba 2 (two single instances)
aaba 1 (one single occurence(+1) and one double occurence(ignored))
aaaba 0 (one single occurence(+1) and one triple (-1)
aaaaaa -1 (six is a multiple of three)
Tham chiếu thực hiện (chưa được chỉnh sửa) trong java:
import java.util.Scanner;
import java.util.regex.*;
public class StrMatcher {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //Scanner to get user input
int total = 0;//Running total of matches
System.out.println("Enter a string: ");
String strBeingSearched = sc.nextLine(); //String that will be searched
System.out.println("Enter string to match with: ");
String strBeingMatched = sc.nextLine(); //Substring used for searching
//Simple regex matcher
Pattern pattern = Pattern.compile("(" + strBeingMatched + ")+");
Matcher matcher = pattern.matcher(strBeingSearched);
while(matcher.find()){ //While there are still matches
int length = matcher.end() - matcher.start();
int numberOfTimes = length/strBeingMatched.length();//Calculate how many times in a row the string is matched
if((numberOfTimes == 1)||((numberOfTimes % 3 == 0) && (numberOfTimes % 5 == 0))){
total++; //Increment counter if single match or divisible by 15
} else if((numberOfTimes % 3 == 0)||(numberOfTimes % 5 == 0)) {
total--; //Decrement counter if divisible by 3 or 5 (but not 15)
}
strBeingSearched = strBeingSearched.substring(matcher.end());
matcher = pattern.matcher(strBeingSearched); //Replace string/matcher and repeat
}
System.out.println(total);
}
}
- Chuỗi sẽ được tìm kiếm có thể có độ dài bất kỳ, nhưng mẫu sẽ chỉ là một ký tự.
- Cả chuỗi sẽ không có ký tự đặc biệt regex.
- Đây là môn đánh gôn ; chương trình ngắn nhất trong byte thắng.
- Không có sơ hở tiêu chuẩn.