笔试+面试问题记录

下面是一些刷题时遇到的问题:

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实习经历

学习中,待更。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值