编写一个Java方法,确定是否有任何一对学生都有相同的课程

时间:2011-12-15 06:04:06

标签: java

这是java工程师的现场面试问题:

  

给定具有属性Course的Student类型数组,编写一个Java方法,确定数组中的任何一对学生是否具有相同的课程。如果找到匹配项,请务必返回布尔值true。假设有大量学生,请尝试提供最有效的解决方案。

     

列出您希望为其实现的测试方法名称   上面的代码。至少为其中一个提供实施

我找不到最有效的解决方案 谁有更好的解决方案?谢谢!

5 个答案:

答案 0 :(得分:5)

如果使用其他数据结构,即Set:

,则只能循环一次
boolean check(Student[] array) {
    HashSet<String> courses = new HashSet<String>();
    for(Student tmp : array){
        if(!courses.add(tmp.getCourse()))
            return true;
    }
    return false;
}

答案 1 :(得分:1)

为什么不使用hashmap?它非常有效。您可以为具有相同课程的学生对构建一个哈希映射,然后使用包含值来输出它们是否在地图中。对于N学生,会有N*(N-1)/2对,所以给定任何一对你只需查看hashmap,然后返回true或false。

使用Amir Afghani的方法:

boolean sameCourse(Student s1, Student s2) { 
    if(s1.getCourse().equals(s2.getCourse()) { 
        return true;
    }
}

然后在两个循环中将所有对放入一个hashmap。

答案 2 :(得分:0)

尝试使用Comparable界面。

您可以根据其中的任何属性比较两个对象。

您可以在here找到更多帮助。

答案 3 :(得分:0)

使用course属性对数组进行排序。然后,您只能走一次阵列并快速识别重复项。

boolean hasStudentsWithSameCourse(Student[] students) {
    Arrays.sort(students, new CourseComparator());
    for(int i = 0; i < students.length-1; i++) {
       if(sameCourse(students[i], students[i+1]) { 
           return true;
       }
    }

    return false;
}

boolean sameCourse(Student s1, Student s2) { 
    if(s1.getCourse().equals(s2.getCourse()) { 
        return true;
    }
}

每次调用此例程时,我更喜欢这个解决方案,而不是创建新的Set。鉴于这是Java,我的解决方案不会产生GC压力,而O(nlogn)运行时与O(n)不符合内存成本O(1)与O(n)的差异。问题是:

  

假设有大量学生。

我的一位同事提出了以下观点:

  

给定一个具有属性Course的Student类型数组,编写一个Java   确定是否有任何一对学生的方法

如果同一个学生不止一次出现在阵列中,那么所写的任何解决方案都不会返回正确的答案。

答案 4 :(得分:0)

//I think this example will help you..

//时间复杂度为o(n),哈希集添加并包含方法复杂度为o(1)

import java.util.HashSet;
import java.util.Set;

public class StudentSimilarCource {

    public static void main(String args[]) {

        Student s1 = new Student(1, "anuj", "science");

        Student s2 = new Student(1, "amit", "botany");

        Student s3 = new Student(1, "anuj", "math");

        Student s4 = new Student(1, "anuj", "science");

        Student[] stuarr = { s1, s2, s3, s4 };

        StudentSimilarCource obj = new StudentSimilarCource();
        System.out.println(obj.findTwoStudent(stuarr));

    }

    private boolean findTwoStudent(Student[] stuarr) {

        Set<String> set = new HashSet<>();

        for (Student s : stuarr) {
            if (set.contains(s.getCourse()))
                return true;
            else
                set.add(s.getCourse());
        }

        return false;
    }
}

class Student {
    int id;
    String name;
    String course;

    public Student(int id, String name, String course) {
        super();
        this.id = id;
        this.name = name;
        this.course = course;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCourse() {
        return course;
    }

    public void setCourse(String course) {
        this.course = course;
    }

}