다음과 같은 문자열이 있다고 가정하십시오.
abaabbbbbaabba
지정된 문자가 입력 문자열에 나타나는 횟수를 계산하지만 문자가 한 번에 한 번만 나타나는 경우에만 계산하십시오 . 예를 들어, 문자 인 경우 a
,
abaabbbbbaabba
^ x x ^
총계는 2입니다 ( aa
' a
는 연속으로 두 번 나타나기 때문에 계산에 포함되지 않습니다 ).
이것은 FizzBuzz와 어떤 관련이 있습니까?
문자가 행에 3 (또는 3의 배수)으로 나타나거나 행에 5 (또는 5의 배수)로 나타나면 카운터가 대신 감소 합니다. 3 배 와 5 배의 배수이면 카운터는 계속 증가합니다. 문자가 한 행에 한 번만 나타나는 경우 카운터가 증가하고 문자가 행에 다른 횟수로 나타나는 경우 (위에 설명 된 상황 외에) 카운터가 증가한다는 점을 기억하십시오.
요약하면 일치하는 문자열이입니다 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)
자바에서 참조 (중복되지 않은) 구현 :
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);
}
}
- 검색 할 문자열은 길이에 제한이 없지만 패턴은 단일 문자입니다.
- 문자열에는 정규 표현식 특수 문자가 없습니다.
- 이것은 코드 골프입니다 . 바이트 단위의 최단 프로그램이 이깁니다.
- 표준 허점이 없습니다.