关于10K面试题的组合排序-归并排序

package com.kevin.demo;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

/**
* @author <a href="mailto:foohsinglong@gmail.com">kevin.long</a>
* @description 2011-12-07 02:14:58
*/
public class TestUser {

/**
* 班级
*/
private Integer classes;

/**
* 类型(teacher or student)
*/
private String type;

/**
* 姓名
*/
private String name;

public TestUser(Integer classes, String type, String name){
this.classes = classes;
this.type = type;
this.name = name;
}

@Override
public boolean equals(Object other) {
if(!(other instanceof TestUser)){
return false;
}
TestUser testUser = (TestUser)other;
return new EqualsBuilder().append(classes, testUser.getClasses())
.append(type, testUser.getType())
.append(name, testUser.getName()).isEquals();
}

@Override
public int hashCode() {
return new HashCodeBuilder().append(classes)
.append(type)
.append(name).toHashCode();
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public String getName() {
return name;
}

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

public Integer getClasses() {
return classes;
}

public void setClasses(Integer classes) {
this.classes = classes;
}

/**
* 归并排序法
* @param users 需要排序集合
*/
public static void quickSort(List<TestUser> users) {
quickSort(users, 0, users.size() - 1);
}

private static void quickSort(List<TestUser> users, int start, int end) {
int left = start;
int right = end - 1;
int pivot = users.get(end).getClasses();
int typeKey = users.get(end).getName().hashCode();

while (left < right) {
if (users.get(left).getClasses() <= pivot) {
left++;
continue;
}
if (users.get(right).getClasses() > pivot) {
right--;
continue;
}
swap(users, left++, right);
}
if (users.get(left).getClasses() < pivot) {
left++;
}else if(users.get(left).getClasses() == pivot){
if(users.get(left).getName().hashCode() < typeKey){
left++;
}
}
swap(users, left, end);
if(left - 1 > start) {
quickSort(users, start, left - 1);
}
if(left + 1 < end) {
quickSort(users, left + 1, end);
}
}

private static void swap(List<TestUser> userSwaps, int a, int b) {
TestUser t = userSwaps.get(a);
userSwaps.set(a, userSwaps.get(b));
userSwaps.set(b, t);
}

/**
* 现有List集合中存放有10W个无序的User(属性:classes 班级;type 身份【学生 or 老师】;name 姓名)对象。
* 要求:用JAVA实现将List集合中的User对象按照1-n班并且每个班的老师必须放在该班级学生的前面输出。
* (一个班只有一个老师,一个班存在多个老师,这两只情况可以分开用两个算法实现,也可以用一个算法实现,但要考虑性能)例如下面格式:
* 1班 老师 张三
* 1班 学生 李四
* 1班 学生 王五
* 2班 老师 张三2
* 2班 学生 李四2
* 2班 学生 王五2
*/
public static void main(String[] args) {
List<TestUser> users = new ArrayList<TestUser>();
users.add(new TestUser(1, TestUserType.TEACHER, "张三"));
users.add(new TestUser(2, TestUserType.TEACHER, "张三2"));
users.add(new TestUser(1, TestUserType.STUDENT, "李四"));
users.add(new TestUser(2, TestUserType.STUDENT, "李四2"));
users.add(new TestUser(1, TestUserType.STUDENT, "王五"));
users.add(new TestUser(2, TestUserType.STUDENT, "王五2"));
long start = System.currentTimeMillis();
quickSort(users); //排序优先级 班级,老师
System.out.println("耗时:" + (System.currentTimeMillis() - start));
for(TestUser user : users){
System.out.println(user.getClasses() +"\t"+ user.getType() +"\t"+ user.getName());
}
}
}


[img]http://dl.iteye.com/upload/attachment/601220/eab818ef-d5d7-39f9-b888-2732d90f8e9b.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 10k面试是指一系列Java编程语言相关的面试目,用于评估面试者的Java编程能力和知识水平。这些问覆盖了Java语法、面向对象编程、集合框架、多线程、异常处理、IO操作等各个方面。 在回答这个目之前,我想说明的是,Java的知识是非常广泛和深入的,任何一个程序员都不可能在所有方面都有完全掌握。而且,面试并不是只看一个人的答案,还会综合考虑其思考方式、解决问能力等因素。因此,不管你是否能回答出这10k个面试中的每一个,都不是衡量一个人能力的唯一标准。 针对Java 10k面试,我建议以下三个步骤来进行准备和回答: 1. 先整体浏览面试目清单:对于每个问,快速浏览目和要求,了解问所涉及的领域和主。 2. 根据自身经验和知识填补知识空缺:将那些你不熟悉或者不了解的问进行标注,然后针对这些问进行学习和复习。可以使用官方文档、编程书籍、网络资源等来获取相关的知识。 3. 练习和实践:在自己的编程环境中使用Java语言进行实践和练习,尽可能多地编写代码来加深对Java的理解。可以从简单的问入手,逐渐扩展到更复杂的问,这样能够更好地理解和应用Java的各种特性和用法。 总之,Java 10k面试是一个全面挑战Java编程能力和知识深度的问集合。准备和回答这个目需要不断的学习和实践,通过不断提高自己的编程技能来应对各种问和挑战。希望以上的建议能够帮到你。 ### 回答2: Java 10k面试指的是Java相关的面试目数量达到10,000道。这个数量非常庞大,覆盖了Java语言的方方面面。以下是简要回答: Java 10k面试中包含了Java的基础知识、面向对象编程、多线程、集合框架、IO流、JVM等多个领域的知识点。对于想要在面试中脱颖而出的应聘者来说,掌握这些知识点非常重要。 基础知识方面,Java 10k面试往往会考察基本数据类型、变量命名规范、运算符优先级等基础概念。此外,还需要了解Java的关键字、访问修饰符、异常处理机制等。 面向对象编程是Java的核心,也是Java 10k面试的重点。面试中可能会问到类与对象的概念、封装、继承与多态等概念,还可能会提问相关的设计原则,如单一职责原则、开闭原则等。 多线程和并发编程是Java的独特特性,也是面试的热点内容之一。Java 10k面试会涉及线程的创建、同步、通信等问,还有线程池的使用和死锁的避免等。 集合框架是Java的核心库之一,Java 10k面试也会涉及到集合类的使用和常见问,如ArrayList与LinkedList的区别、HashMap的实现原理等。 IO流是Java中进行文件和网络操作的重要手段,Java 10k面试可能会涉及IO流的分类、字节流和字符流的区别、序列化和反序列化等。 还有JVM相关的知识在Java 10k面试中也会涉及到,如垃圾回收机制、堆和栈的区别等。 总之,掌握这些Java的关键知识点是面试成功的前提。在面试中,不仅要掌握理论知识,还要注重实践经验和项目经验的积累。通过刷、阅读书籍和实战练习,可以帮助应聘者更好地准备Java 10k面试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值