力扣SQL练习
前言最近整理了一下之前刷力扣SQL题的一些笔记。大部分都是DDL语句的使用,像笛卡尔积、各种Join、窗口函数、日期函数都是数据库很重要的知识点,还有where和having的区别、group by的底层,都是面试经常会问到的。
常数1的使用作用:加快效率
当我们只关心数据表有多少记录行而不需要知道具体的字段值时,类似select 1 from tbl是一个很不错的SQL语句。它通常用于子查询。这样可以减少系统开销,提高运行效率,因为这样子写的SQL语句,数据库引擎就不会去检索数据表里一条条具体的记录和每条记录里一个个具体的字段值并将它们放到内存里,而是根据查询到有多少行存在就输出多少个“1”,每个“1”代表有1行记录,同时选用数字1还因为它所占用的内存空间最小,当然用数字0的效果也一样。在不需要知道具体的记录值是什么的情况下这种写法无疑更加可取。
举个例子,统计每个班的学生人数
常规写法:select class,count (*) as pax from students group by class;更优写法:select class,count (1) as pax from ...
手写一个简单的HashMap
手写一个简单的HashMap代码实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126package com.thx;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;public class MyHashMap<K, V> { private static final int DEFAULT_CAPACITY = 16; private static final fl ...
第k大个数
第k大个数导言寻找数组第K大数是大厂面试中经常考到的一题,有的小伙伴会直接用sort()进行排序,两行代码解决,这样看似可行,实则掉入了出题人的陷阱。面试官希望看到的是你对算法的理解,而不是函数的调用。
我们都知道,排序算法的复杂度是$O(nlogn)$,挑选最大值的算法是遍历一遍,复杂度为$O(n)$。
对于第k大个数这种情况,既然不能用排序的话,我可以扫描k次,从而求解,复杂度为$O(kn)$。代码如下:
12345678910111213141516class Solution {public: int findKthLargest(vector<int> a, int n, int k) { for(int i=0; i<k; ++i) { for(int j=0; j<n-i-1; ++j) { if(a[j]>a[j+1]) { int temp = a[j]; ...
NIO网络编程
NIO网络编程阻塞式
阻塞模式下,相关方法都会导致线程暂停
ServerSocketChannel.accept 会在没有连接建立时让线程暂停
SocketChannel.read 会在通道中没有数据可读时让线程暂停
阻塞的表现其实就是线程暂停了,暂停期间不会占用 cpu,但线程相当于闲置
单线程下,阻塞方法之间相互影响,几乎不能正常工作,需要多线程支持
但多线程下,有新的问题,体现在以下方面
在 HotSpot JVM 中,默认情况下,Java 线程的栈空间大小为 1MB,这还没算它所占用的堆空间和调度所需要的额外开销。如果连接数过多,必然导致 OOM,并且线程太多,会因为频繁上下文导致CPU利用降低
可以采用线程池技术来减少线程数和线程上下文切换,但治标不治本,如果有很多连接建立,但长时间 inactive,会阻塞线程池中所有线程,因此不适合长连接,只适合短连接
服务端代码
123456789101112131415161718192021222324252627282930313233public class Server { public static ...
NIO三大组件
NIO三大组件简单介绍Channel与Buffer
Java NIO系统的核心在于:通道(Channel)和缓冲区(Buffer)。通道表示打开到 IO 设备(例如:文件、套接字)的连接。若需要使用 NIO 系统,需要获取用于连接 IO 设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理
简而言之,通道负责传输,缓冲区负责存储
常见的Channel有以下四种,其中FileChannel主要用于文件传输,其余三种用于网络通信
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
Buffer有以下几种,其中使用较多的是ByteBuffer
ByteBuffer
MappedByteBuffer
DirectByteBuffer
HeapByteBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
CharBuffer
1、Selector在使用Selector之前,处理socket连接还有以下两种方法
使用多线程技 ...
最长递增子序列
最长递增子序列题目介绍给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
示例 1:
123输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:
12输入:nums = [0,1,0,3,2,3]输出:4
示例 3:
12输入:nums = [7,7,7,7,7,7,7]输出:1
提示:
1 <= nums.length <= 2500
-104 <= nums[i] <= 104
方法一:暴力搜(会超时)1234567891011121314151617class Solution { public int lengthOfLIS(int[] nums) { int n = nums.length; return dfs(nums, - ...
个人博客搭建流程
个人博客搭建流程本贴我将为大家介绍一下我个人博客搭建的流程。
整体架构由于个人网站大部分都是一些静态资源,如html、css、图片、markdown文件等,不需要与后端进行交互,也不需要存储一些关系复杂的数据,因此只需要实现一个大前端即可。
如果你对页面的美观布局没有太大的追求,只是在页面上写一些相对简单的内容,那完全可以自己用html写一个页面,然后部署到nginx服务器上面。但是如果你想长期维护你的网站,并且想专注于内容的创作而非技术实现,可以试着用WordPress、Jekyll、Hexo等网站构建工具。本人使用的网站构建工具是Hexo,对其他工具感兴趣的小伙伴也可以自行尝试。
网站构建工具的原理网站构建工具的原理是将一个网站的基本结构和功能封装成软件组件,用户可以通过简单的操作,使用这些组件来快速地搭建出自己所需的网站。用户可以自由选择主题、插件和小部件等组件,根据自己的需求和喜好来定制网站的外观和功能。
网站构建工具实际上是在后台自动进行代码编写和程序运行。工具会把用户在配置文件(如xml、yml等)或图形化界面上进行的操作转化为相应的HTML、CSS、JavaScript代 ...