1>题目描述
- 题目描述:
- 编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次。
- 例如,对于字符串abaca而言,有a、b、c三种不同的字符,因此输出3。
- 输入描述:
- 输出描述:
- 输出范围在(0~127)字符的个数。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b3fb63365644091b4cd505af8f9cdc54.png)
2>解法
- 利用HashSet轻松解决,无序不重复,最后统计Set的size()即可
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String s =scanner.nextLine();
int i = 0;
HashSet<Character> set = new HashSet<>();
while(i<s.length()){
set.add(s.charAt(i));
i++;
}
System.out.println(set.size());
}
}
3>更优解
- 凡是涉及到去重统计都可以用位图实现。因为每一个不同的数据只需要用二进制的一位存储即可,大大减小了统计所使用的存储空间
import java.util.Scanner;
import java.util.BitSet;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line = scanner.next();
BitSet bitSet = new BitSet(128);
for (char c : line.toCharArray()) {
if (!bitSet.get(c)) {
bitSet.set(c);
}
}
System.out.println(bitSet.cardinality());
}
}