数据结构与算法

散列表练习

2019-12-27  本文已影响0人  暮想sun

1.89 名选手参加学校运动会。为了方便记录成绩,每个选手胸前都会贴上自己的参赛号码。这 89 名选手的编号依次是 1 到 89。现在我们希望编程实现这样一个功能,通过编号快速找到对应的选手信息。

将编号当做数组下标,数组存储选手信息,根据hash函数获取散列后下标信息

      //参加学生
    private Student[] students;

    //当前参加人数
    private int num;

    public SchoolSport() {
        this.students = new Student[89];
    }

    public void add(Student student) {

        String key = student.grade.concat(student.classNum);
        if (num < 10) {
            key = key + "0" + num;
        } else {
            key = key + num;
        }
        student.number = key;
        students[hash(key)] = student;
        num++;
    }

    public Student get(String number) {
        return students[hash(number)];
    }

    public int hash(String key) {

        if (StringUtils.isEmpty(key)) {
            return -1;
        }

        //后两位作为数组下标
        String lastStr = key.substring(key.length() - 2);
        return Integer.parseInt(lastStr);
    }

    private static class Student {

        //姓名
        private String name;

        //年级
        private String grade;

        //班级
        private String classNum;

        //编号
        private String number;


        public Student(String name, String grade, String classNum) {
            this.name = name;
            this.grade = grade;
            this.classNum = classNum;
        }

2.Word 文档中单词拼写检查功能是如何实现的?

常用的英文单词有 20 万个左右,假设单词的平均长度是 10 个字母,平均一个单词占用 10 个字节的内存空间,那 20 万英文单词大约占 2MB 的存储空间,就算放大 10 倍也就是 20MB。对于现在的计算机来说,这个大小完全可以放在内存里面。所以我们可以用散列表来存储整个英文单词词典。当用户输入某个英文单词时,我们拿用户输入的单词去散列表中查找。如果查到,则说明拼写正确;如果没有查到,则说明拼写可能有误,给予提示。

3.假设我们有 10 万条 URL 访问日志,如何按照访问次数给 URL 排序?

依次遍历数据,将URL为key, 访问次数为value,放入散列表,并记录最大值。再将最大值数据排序,数据较小则使用桶排序,较大可以使用快速排序。

4.有两个字符串数组,每个数组大约有 10 万条字符串,如何快速找出两个数组中相同的字符串?

选择一组数组数据,以字符串数据为key, value为出现次数,存入散列表。再遍历两一个字符串,如果查找散列表数据,如果value大于0,则存在相等字符串。

上一篇 下一篇

猜你喜欢

热点阅读