文章目录
2019Java基础面试题汇总
一、说一下几种常见的排序算法和分别的复杂度
冒泡排序 : 时间复杂度是O(n2)
选择排序 : 时间复杂度是O(n2)
插入排序 : 时间复杂度是O(n2)
堆排序 : 时间复杂度是O(nlog n)
并归排序 : 时间复杂度是O(nlog2n)
快速排序 : 最理想情况算法时间复杂度O(nlog2n),最坏O(n^2)
二、用Java写一个冒泡排序法
public static void main(String[] args){
int arr[ ] = {1,6,0,-1,9};
int temp = 0;//中间值
//--冒泡排序法
//外层循环,它决定一共走了几趟
for(int i = 0;i < arr.length-1;i++){
//内层循环,开始逐个比较
//如果我们发现前一个数比后一个数大,则交换
for(int j = 0;j < arr.length-1;j++){
if(arr[j] > arr[j+1]){
//换位
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
//输出结果
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
三、描述一下链式存储结构
链式存储结构,又叫链接存储结构。在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以使连续的,也可以是不连续的)。一般在计算机的硬盘中,文件都是链式存储的。我们知道,,多个扇形组成一个簇,簇是计算机存储数据的基本单位。而一个文件是存储在多个在空间上也许并不相连的簇中的。这就是链式存储。但是为了能够读取出这个文件,计算机会在该文件第一部分的尾部写上第二部分所在的簇号。第二部分的尾部又写上第三部分的簇号,以此类推,最后一部分写上一段代码,表示这是该文件的最后一部分。值得一提的是,高簇号在后。(如代码所示的1234实为簇3412)文件所占簇可认为是随机分配的。
特点:1、比顺序存储结构的存储密度小(链式存储结构中每个节点都有数据域与指针域两部分组成,相比顺序存储结构增加了存储空间)。
2、逻辑上相邻的节点物理上不必相邻。
3、插入、删除灵活(不必移动节点,只要改变节点中的指针)。
4、查找节点时链式存储要比顺序存储慢。
5、每个节点是由数据域和指针域组成
6、由于簇是随机分配的,这也使数据删除后覆盖几率降低,恢复可能提高。
四、如何遍历一颗二叉树?
前序遍历:按照“根左右”,先遍历根节点,再遍历左子树,再遍历右子树
中序遍历:按照“左根右”,先遍历左子树,再遍历根节点,再遍历右子树
后序遍历:按照“左右根”,先遍历左子树,再遍历右子树,再遍历根节点
五、倒排一个LinkedList
class Node{
char value;
Node next;
}
//非递归实现
public Node reverse(Node current) {
Node previous = null;
Node next = null;
while (current !=null) {
//存储下一个节点
next = current.next;
current.next = previous; //反转
//更新遍历节点
previous = current;
current = next;
}
return current;
}
递归方式:
假设1~n-1已经全部完成,那么1 -> 2 -> 3 -> 4 ------> 3 -> 2 -> 1 -> null 和 4。因此,我们就把4加在3前面即可。
corner case:和上一样
code:
public ListNode reverseLinkedList(ListNode root){
if( root == null || root.next == null ) return root;
ListNode cur = root;
while ( cur.next != null ){
cur = cur.next;
}
helper(root, rot.next);
return cur;
}
public void helper(ListNode first,ListNode second){
if ( second == null ) return first;
helper( second, second.next );
first.next = second.next;
second.next = first;
}
六、用Java写一个递归遍历目录下面的所有文件
public class Counter2 {
public static void main(Stringp[ args) {
//取得目标目录
File file = new File("D:");
//获取目录下子文件及子文件夹
File[] files = file.listFiles();
readFile(files);
}
public static void readfile(File[] files) {
if ( files == null ){ //如果目录为空,直接退出
return;
}
for(File f : files){
//如果是文件,直接输出名字
if(f.isFile()){
System.out.println(f.getName());
}
//如果是文件夹,递归调用
else if (f.isDirectory()){
readfile(f.listFiles());
}
}
}
}
七、接口与抽象类的区别
八、
九、