【数据结构与算法_java】面试题及答案汇总

本文汇总了《剑指offer》50道经典面试题,涵盖单例模式、链表操作、数组与矩阵问题、二叉树相关、动态规划等核心算法。同时讨论了HashMap与HashTable的区别、解决哈希冲突的方法、ArrayList与LinkedList的差异、集合的快速失败与安全失败机制等理论知识。文章旨在帮助面试者深入理解数据结构和算法在Java中的应用。
摘要由CSDN通过智能技术生成

文章目录


前    言

本文将收录《剑指offer:50道金典面试题》、LeetCode上部分经典题目以及其他【据结构和算法】数面试题。

PS:目录中有粉红色标注的题目是已经附带答案


正    文

一、剑指offer:50道金典面试题

面试题1:赋值运算符函数

在这里插入图片描述

class CMyString
{
   
public:
	CMyString(char* pData = NULL);
	CMyString(const CMyString& str);
	~CMyString(void);

private:
	char* m_pData;
}

\qquad

解题思路
java只能重载“+”和“+=”两个运算符,别的都不可以。

面试题2:实现单例模式

在这里插入图片描述
\qquad

解法一:饿汉式(线程安全,效率高,不能延时加载,典型的以空间换时间)
public class Singleton {
   
	private static Singleton instance = new Singleton();
 
	// 私有化构造方法
	private Singleton() {
   
 
	}
 
	public static Singleton getInstance() {
   
		return instance;
	}
 
}

饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要判断了,节省了运行时间。

\qquad

解法二:懒汉式(线程不安全,能延时加载,以时间换空间)
public class Singleton {
   
	//2.本类内部创建对象实例
	private static Singleton instance = null;
 
	/**
	* 1.构造方法私有化,外部不能new
	*/
	private Singleton() {
   
 
	}
 
	//3.提供一个公有的静态方法,返回实例对象
	public static Singleton getInstance() {
   
		if (instance == null) {
   
			instance = new Singleton();
		}
		return instance;
	}
}

调用顺序时序图:
在这里插入图片描述
单例模式的懒汉式体现了缓存的思想,延时加载就是一开始不要加载资源或者数据,一直 等,等到马上就要使用这个资源的或者数据了,躲不过去了才去加载。

懒汉式是定性的时间换空间,不加同步的懒汉式是线程不安全的,如下示例:
在这里插入图片描述
那么如何解决这个问题呢?
就是接下来我们要讲的解法三——使用双重检查加锁机制实现单例模式

\qquad

解法三:Double CheckLock实现单例(线程安全,能延时加载,以时间换空间)——面试官期待的解法之一
public class Singleton {
   
	private volatile static Singleton instance = null;
 
	// 私有化构造方法
	private Singleton() {
   
 
	}
 
	public static Singleton getInstance() {
   
		if (instance == null) {
   
			synchronized (Singleton.class) {
   
				if (instance == null) {
   
					instance = new Singleton();
				}
			}
 
		}
		return instance;
	}
	
}

\qquad

解法四:静态内部类实现(线程安全,效率高,可延时加载)——面试官期待的解法之一
public class Singleton {
   
	private static class SingletonHoler {
   
		/**
		 * 静态初始化器,由JVM来保证线程安全
		 */
		private static Singleton instance = new Singleton();
	}
 
	private Singleton() {
   
	}
 
	public static Singleton getInstance() {
   
		return SingletonHoler.instance;
	}
 
}

\qquad

解法五:枚举类(线程安全,效率高,不能延时加载,可以天然的防止反射和反序列化调用)
public enum Singleton {
   
	uniqueInstance;// 定义一个枚举的元素,它 就代表了Singleton的一个实例
 
	public void singletonOperation() {
   
		// 功能处理
		System.err.println("功能处理");
	}
 
}

\qquad

扩展阅读

java 单例模式的几种实现方式(包含防止单例模式被破坏的解决方案)


面试题3:二维数组中的查找

在这里插入图片描述

解题思路

别从左到右一个一个比,先比右上角的或左下角的,如果要找的数比这个数小,剔除这一列,比较前一列的第一个数。如果大,剔除这一行,再比较该列下一个数。

注意:如果先比左上角或右下角的是不行的。

代码实现
import java.util.Scanner;
 
public class Find{
   
	public static void main(String[] args){
   
		int[][
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值