文章目录
- 一、剑指offer:50道金典面试题
-
- 面试题1:赋值运算符函数
- 面试题2:实现单例模式
- 面试题3:二维数组中的查找
- 面试题4:替换空格
- 面试题5:反向打印链表
- 面试题6:重建二叉树
- 面试题7:用两个栈实现队列(附带用两个队列实现栈)
- 面试题8:旋转数组的最小数字
- 面试题9:斐波那契数列
- 面试题10:二进制中 1 的个数
- 面试题11:数值的整数次方
- 面试题12:打印 1 到最大的 n 位数
- 面试题13:在O(1)时间删除链表结点
- 面试题14:调整数组顺序使数组中奇数位于偶数前
- 面试题15:链表中倒数第K个结点
- 面试题16:反转链表
- 面试题17:合并两个排序的链表
- 面试题18:树的子结构
- 面试题19:二叉树的镜像
- 面试题20:顺时针打印矩阵
- 面试题21:包含 min 函数的栈
- 面试题22:栈的压人、弹出序列
- 面试题23:从上往下打印二叉树
- 面试题24:二叉搜索树的后序遍历序列
- 面试题25:二叉树中和为某一值的路径
- 面试题26:复杂链表的复制
- 面试题27:二叉搜索树和双向链表
- 面试题28:字符串的排序
- 面试题29:数组中出现次数超过一半的数字
- 面试题30:最小的 k 个数
- 面试题31:连续子数组的最大和(动态规划思想)
- 面试题32:从1到n整数中1出现的次数
- 面试题33:把数组排成最小的数
- 面试题34:丑数
- 面试题35:第一个只出现一次的字符
- 面试题36:数组中的逆序对
- 面试题37:两个链表的第一个公共节点
- 面试题38:数字在排序数组中出现的次数
- 面试题39:二叉树的深度
- 面试题40:数组中只出现一次的数字
- 面试题41:和为s的两个数字与和为s的连续正数序列
- 面试题42:翻转单词顺序与左旋转字符串
- 面试题43:n个骰子的点数(动态规划)
- 面试题44:扑克牌的顺子
- 面试题45:圆圈中最后剩下的数字(约瑟夫环问题)
- 面试题46:求1+2+...+n
- 面试题47:不用加减乘除做加法(位运算)
- 面试题48:设计一个不能被继承的类(final修饰 )
- 面试题49:字符串转整数
- 面试题50:二叉树两个结点的最低公共祖先
- 二、LeetCode上经典题目
- 三、其他面试题(理论知识)
-
- 1.说说常见的集合有哪些。
- 2. HashMap 与 HashTable 的区别。
- 3. HashMap 是怎么解决哈希冲突的
- 4. HashMap 中为什么数组长度要保证 2 的幂次方。
- 5.什么是 Java 集合的快速失败机制“fail-fast”, 以及安全失败“fail-safe”。
- 6. ArrayList 和 LinkedList 的区别。
- 7. HashSet 是如何保证数据不可重复的。
- 8. BlockingQueue 是什么。
- 9. JDK8 中 HashMap 为什么选用红黑树而不是 AVL 树
- 10. JDK8 中 HashMap 链表转红黑树的阈值为什么选 8?
- 11. 说下几种常见的排序算法及其复杂度
- 12. Hashmap 什么时候进行扩容呢?
- 13. HashSet 和 TreeSet 有什么区别?
- 14. LinkedHashMap 的实现原理?
- 15. 什么是迭代器 (Iterator)?
- 16. Iterator 和 ListIterator 的区别是什么?
- 17. Collection 和 Collections 的区别。
|
本文将收录《剑指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
|
面试题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
|
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[][