2019Java基础面试题汇总(更新中。。。)


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());
				}
			}
		}
	}

七、接口与抽象类的区别

在这里插入图片描述

八、
九、

猜你喜欢

转载自blog.csdn.net/weixin_43918514/article/details/86777439