这是java工程师的现场面试问题:
给定具有属性Course的Student类型数组,编写一个Java方法,确定数组中的任何一对学生是否具有相同的课程。如果找到匹配项,请务必返回布尔值true。假设有大量学生,请尝试提供最有效的解决方案。
列出您希望为其实现的测试方法名称 上面的代码。至少为其中一个提供实施
我找不到最有效的解决方案 谁有更好的解决方案?谢谢!
答案 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)
答案 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;
}
}