本题要求你计算A?B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A?B。
输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过10的四次方,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式:
在一行中打印出A?B的结果字符串。
输入样例:
I love GPLT! It's a fun game!
aeiou
输出样例:
I lv GPLT! It's fn gm!
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/**
* 最终优化版
* 用BufferedReader和BufferedWriter:相比于Scanner和System.out.println,这些类在处理大量数据时更加高效。
* 直接操作原始字符数组:减少对StringBuilder的依赖,直接在输入的字符数组上操作,减少了内存复制的开销。
* 使用布尔数组而非整数数组:这可以减少内存占用,尽管在这种情况下影响可能不大。
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
char[] A = br.readLine().toCharArray();
char[] B = br.readLine().toCharArray();
boolean[] ascii = new boolean[128]; // 使用布尔数组而非整数数组
for (char c : B) {
ascii[c] = true;
}
int len = 0;
for (char c : A) {
if (!ascii[c]) {
A[len++] = c; // 直接在原数组上操作
}
}
bw.write(A, 0, len);
bw.flush();
bw.close();
br.close();
}
}
import java.util.HashSet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 写法二
*/
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String A = br.readLine();
String B = br.readLine();
HashSet<Character> setB = new HashSet<>();
for (char ch : B.toCharArray()) {
setB.add(ch);
}
StringBuilder result = new StringBuilder();
for (char ch : A.toCharArray()) {
if (!setB.contains(ch)) {
result.append(ch);
}
}
System.out.print(result.toString());
br.close();
}
}