題目描述
約翰發現了各式各樣的岩石,每個岩石都是由多種元素組成,每種元素使用小寫英文字母來表示。一種元素可以用來重複組成同種岩石,而每個岩石都有的元素稱為「寶石元素」。給定一個N顆石頭的組成清單,請計算出其中的寶石元素數量。
原題網址
輸入格式
第一行為一個整數N,表示石頭的數量,範圍在1到100之間(包含1和100)。接下來的N行用小寫英文字母表示石頭的組成元素,每行的字元數量範圍在1到100之間(包含1和100)。
輸出格式
輸出寶石元素數量,如果沒有任何寶石元素,輸出0即可。
範例輸入
3
abcdde
baccd
eeabg
abcdde
baccd
eeabg
範例輸出
2
額外解釋
只有a和b兩種元素可在所有岩石中被找到,因此這堆石頭中有a和b兩個寶石元素。
解題概念
宣告一個長度為26的整數陣列,用來儲存26個字元在不同的岩石中出現的次數,且在同一顆岩石中重複出現的話只算一次。一開始先讀入整數N,接著再分別讀取N個岩石的組成資料。逐一測試26個字母在該顆岩石中有沒有出現過,如果有的話,整數陣列的中該字母的次數就要加一。加完所有N個岩石的結果之後,最後利用Java 8的串流過濾功能,輸出出現次數為N的陣列元素數量,即為寶石元素的數量。
參考答案
import java.util.Arrays;
import java.util.Scanner;
import java.util.stream.Stream;
public class Solution {
public static void main(final String[] args) {
final Scanner sc = new Scanner(System.in);
final int n = Integer.parseInt(sc.nextLine());
final Integer[] counter = new Integer[26];
Arrays.fill(counter, 0);
for (int i = 0; i < n; ++i) {
final char[] s = sc.nextLine().toCharArray();
final int length = s.length;
ALPHABET:
for (int j = 0; j < 26; ++j) {
final char cc = (char) (j + 'a');
for (int k = 0; k < length; ++k) {
final char c = s[k];
if (c == cc) {
++counter[j];
continue ALPHABET;
}
}
}
}
System.out.println(Stream.of(counter).filter(a -> a == n).count());
}
}