华为机试-HJ10 字符个数统计

79 阅读1分钟

题目

image.png

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());
        }
    }
}

image.png

思路:

1、list.contains去重、listsize就是最后的个数

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());
    }
}

image.png

总结;

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());
        }
    }
}

image.png

总结:

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());
        }
    }
}

image.png

总结:

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());
        }
    }
}

image.png

总结; 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);
    }
}

image.png

总结: 1、 int[] a = new int[128]; 讨巧了、用了128、再多性能就不一定了

2、用数组坐标+boolean实现统计不重复元素个数的思路、这个就是list.contains的功能代替

3、这个很难用到平时工作中、思路做了解 、还是list使用场景多、多熟悉掌握list相关的实现才是重要的