下面是一些刷题时遇到的问题:
1.假设基准值为数组首元素的快速排序,要使得数组满足非降序排列,下列数据分布导致快排算法效率最低的是__。
2-6-3-7-5-1-4
6-2-3-5-4-1-7
7-5-3-2-4-1-6
1-5-7-2-4-6-3
1-2-3-4-5-6-7
4-1-3-7-5-6-2
解析:基本有序的情况下:快排最慢。所以选择的是1-2-3-4-5-6-7
2.下列结果正确的是:
class Person {
String name = "do1";
public Person(String name) {
this.name = name;
}
}
class Employee extends Person {
String empId = "0001";
public Employee(String name) {
empId = id;
}
}
class Test{
public static void main(String[] args) {
Employee e = new Employee("test");
System.out.println(e.empId);
}
}
A. 输出do1
B. 编译出错
C. 输出test
D. 输出0001
解析:选择B
这题主要考察对象创建的过程。如果子类的构造函数中没有显式调用父类的构造器,那么默认会调用父类无参的构造函数。但是代码中没有给出父类的无参构造函数,所以编译时不通过的。
eclipse上显示:
报错1:Implicit super constructor Test_8_30.Person() is undefined. Must explicitly invoke another constructor
有道翻译:隐式超级构造函数Test_8_30.Person()未定义。必须显式调用另一个构造函数
理解:这是因为在设计时,子类必须调用父类的构造器(为什么),且如果没有显式调用父类构造器,则调用默认的父类构造器,但是而如果父类已经实现了其他构造器,则不存在默认构造器了,所以就没法调用默认的了。这是时候就会报错。
解决办法:super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)
报错2:The method main cannot be declared static; static methods can only be declared in a static or top level type
有道翻译:方法main不能声明为静态;静态方法只能在静态类型或顶层类型中声明
理解:首先主函数public static void main(String arg[]){ } 之所以要用static修饰,是因为:把main()方法定义为静态方法,可以使得Java虚拟机只要加载了main()方法所属的类,就能执行main()放法,而无须先创建这个类的实例。
所以,main方法必须有staitc修饰,否则在类加载时无法运行(为什么)。
main方法不用staitc修饰,编译可以通过
但是无法运行,正是因为没有main函数作为Test_8_30类的入口地址。
那么,为了能够类中有main方法,就把Test作为静态内部类,这时又报错。。。
报错:No enclosing instance of type Test_8_30 is accessible. Must qualify the allocation with an enclosing instance of type Test_8_30 (e.g. x.new A() where x is an instance of Test_8_30).
有道翻译:不能访问类型Test_8_30的封闭实例。必须使用类型为Test_8_30的附带实例(例如x)来限定分配。new A()其中x是Test_8_30的实例。
理解:静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,必须通过外部类的实例去访问。也就是说,要想在静态内部类Test中访问外部类Test_8_30的内部类Employee就必须通过Test_8_30的实例去访问。
这时候就可以这样:先实例化Test_8_30再实例化Employee,通过Employee的父类构造函数获得一个Employee的实例e:
可见,编译没报错,运行结果如下:
总结:Java虚拟机加载Test_8_30类时,就会寻找类中的静态变量、静态方法以及静态内部类,这时静态内部类Test也就被加载,同样,在加载Test类时也会加载里面的静态方法—main方法,这就等同于:加载Test_8_30类的时候就加载了main方法。
综上所述,选B, 编译出错。
3.下列哪些是JSON格式结构(多选)
A. {id:’1’,name:’do1’}
B. [‘java’,’javascript’]
C. {‘java’,’javascript’}
D. [id:’1’,name:’do1’]
解析:一个都不是
分析:首先,看下Json.cn上的json语法要求:
这就可以理解上面错误的地方:
1.ABCD都没有双引号,且必须是双引号;
单引号情况,报错!
双引号情况,通过!
2.BC没有键值对(缺冒号);
3.D的是中括号,表示一个数组,数组元素是一个值。
数组元素为键值对时报错。
数组元素为单值时正确。
总结:Json有两种结构,一是{ }表示的对象,对象里放的是键值对,其中值可以是数组;二是[ ]表示的数组,数组里放的是单值元素,其中元素可以是对象。两者用的都是双引号!
4.已知一个包含10个随机数字的数组,数字不重复,给定其中的两个随机数,获取这两个数在随机数组从小到大排序后在数据中的坐标值。时间复杂度尽量低一些
使用快排的partition,将给出的随机数做基准值返回的坐标就是了。两个随机数就调用两次快排的partition。
// 支点左边都比支点小,支点右边都比支点大
public int partition(Integer[] nums, int target) {
int lt = -1;//[0,lt]<target
int gt = nums.length;//[gt,nums.length-1]>target
int i = 0;
while (i < gt) {
if (nums[i] == target)
i++;
else if (nums[i] < target) {
lt++;
swap(nums, i, lt);
i++;
} else {
gt--;
swap(nums, gt, i);
}
}
// 返回支点的坐标
return gt - 1;
}
private void swap(Integer[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
未理解
以上题目均来自于Java3y的个人面试经历~~~
题目来源:广州三本找Java实习经历