本文探讨了数组相关的常见算法问题及解法。涵盖了二维数组的顺时针旋转90度、寻找数组中唯一未成对的元素(利用位运算)、在数组中寻找和为特定值的两个数(使用HashMap)、求数组中连续子向量的最大和(动态规划思想)、以及寻找数组中前K个最大数(快排或堆排)。文章分别给出了每个问题的Java代码实现,并简要说明了其思路和考察点。这些问题均属于数组操作的经典范畴,在面试和实际开发中具有较高的应用价值。

本文探讨了多种排序算法及其原理。首先介绍了冒泡排序的Java实现,并列举了常见的排序方法,包括插入排序、交换排序(如冒泡排序和快速排序)、选择排序、归并排序和分配排序。 随后,文章深入讲解了归并排序和堆排序的原理:归并排序采用分治法,将数组递归分解为小组直至单个元素,再合并有序小组;堆排序则基于堆数据结构,通过最大堆调整和创建最大堆来实现排序。 此外,文章还讨论了如何获取数据流中的中位数,提出了使用最大堆和最小堆组合的数据结构,以实现高效的插入和查找中位数操作。最后,总结了常见的排序算法及其时间复杂度,并详细解释了快速排序的运作机制,包括分区过程和中枢元素的选取。

文章解释了 JVM 中堆、栈和方法区的作用与区别。堆是所有线程共享的运行时数据区,存放对象本身,由程序员通过 new 分配,GC 回收;栈为每个线程私有,由编译器自动分配释放,保存基本类型变量和对象引用,定位堆中对象。方法区(静态区)同样共享,保存类信息、static 变量和常量。对比指出栈空间有限、访问快,堆空间大、灵活但访问慢,垃圾回收负责堆的释放。

Java 优先级队列(PriorityQueue)是基于堆实现的无界队列,元素按自然顺序或自定义比较器排序。创建时可提供比较器以决定排序规则。队列不接受 null 元素,因为无法确定其排序关系。PriorityQueue 不是线程安全的,入队和出队操作的时间复杂度均为 O(log n)。

本文围绕几类常见高级算法展开介绍。首先阐述 LRU(最近最少使用)缓存的原理、get/put 接口及其命中率、实现复杂度和空间开销;随后说明后缀(逆波兰)表达式无需括号即可确定运算顺序的优势;接着给出基于 MD5 的 URL 压缩思路,即对原链接做 32 位哈希再截取生成短链;随后详细解析 SnowFlake 分布式唯一递增 ID 的 64 位结构(符号位、时间戳、机器码、序列号)并列出优缺点;最后提供 LFU(最不经常使用)缓存的 O(1) 实现思路与完整 Java 代码,说明节点、哈希表以及频率链表的协同工作方式。