题目
www.nowcoder.com/practice/eb…](www.nowcoder.com/practice/eb…)
我的题解
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str;
List<Character> list = new ArrayList<>();
while ((str = bf.readLine()) != null) {
char[] arr = str.toCharArray();
for (int i = 0; i < arr.length; i++) {
if (!list.contains(arr[i]) && 0 <= (char)arr[i] && (char)arr[i] <= 127) {
list.add(arr[i]);
}
}
System.out.println(list.size());
}
}
}
思路:
1、list.contains
去重、list
的size
就是最后的个数
2、char
可以直接参与运算
3、注意 for+if+收集的思想
、符合就收集、不符合就继续下一个
参考题解
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
HashSet<Character> set = new HashSet<>();
String line = s.nextLine();
char[] chars = line.toCharArray();
for (char aChar : chars) {
set.add(aChar);
}
set.stream().filter(c -> Integer.valueOf(c) >= 0 &&
Integer.valueOf(c) <= 127).collect(Collectors.toSet());
System.out.println(set.size());
}
}
总结;
1、太慢了、一点一点来排查慢的地方
import java.io.*;
import java.util.*;
import java.util.stream.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str;
HashSet<Character> set = new HashSet<>();
while ((str = bf.readLine()) != null) {
char[] chars = str.toCharArray();
for (char aChar : chars) {
set.add(aChar);
}
set.stream().filter(c -> Integer.valueOf(c) >= 0 &&
Integer.valueOf(c) <= 127).collect(Collectors.toSet());
System.out.println(set.size());
}
}
}
总结:
1、BufferedReader
替换 Scanner
快了20ms左右
import java.io.*;
import java.util.*;
import java.util.stream.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str;
HashSet<Character> set = new HashSet<>();
while ((str = bf.readLine()) != null) {
char[] chars = str.toCharArray();
for (char aChar : chars) {
if (0 <= aChar && aChar <= 127) {
set.add(aChar);
}
}
System.out.println(set.size());
}
}
}
总结:
1、不使用java8、优化了将近120ms
import java.io.*;
import java.util.*;
import java.util.stream.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str;
HashSet<Character> set = new HashSet<>();
while ((str = bf.readLine()) != null) {
char[] arr = str.toCharArray();
for (int i = 0; i < arr.length; i++) {
if (0 <= arr[i] && arr[i] <= 127) {
set.add(arr[i]);
}
}
System.out.println(set.size());
}
}
}
总结; 1、换了循环方式也没什么影响
高效题解
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[]args)throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s = bf.readLine();
int[] a = new int[128];
int count = 0;
for (int i = 0; i < s.length(); i++) {
char b = s.charAt(i);
if (a[b] == 0) {
count++;
a[b] = 1;
}
}
System.out.println(count);
}
}
总结:
1、 int[] a = new int[128];
讨巧了、用了128、再多性能就不一定了
2、用数组坐标+boolean实现统计不重复元素个数的思路、这个就是list.contains
的功能代替
3、这个很难用到平时工作中、思路做了解 、还是list使用场景多、多熟悉掌握list相关的实现才是重要的