Interview
ready anytime
gary-liu
Like technology, like recording life. Since I went to a foreign company, I have to use English to quickly integrate it. WeChat Offical account: gary_foreign
展开
-
两个数组A和B的长度相同,找出 A[i] > B[i] 数量最多的A的一个排序结果,保证A对应B的顺序不变
题目 两个数组A和B的长度相同,找出 A[i] > B[i] 数量最多的A的一个排序结果,保证A对应B的顺序不变 A=[2,5,9,1] B=[6,3,7,4] 因为A[i] > B[i]的数共有两个,比如A的一个结果可以是 A=[9,1,2,5]分析 对B排序获得新数组:bSort=[3,4,6,7],被使用过后就把值改为 -1 (或者其他标志性的值) bSort 相对于B数组的顺序索引数组:bLocation=[1,3,0,2]原创 2020-12-30 15:36:00 · 838 阅读 · 0 评论 -
求一个整数加上100后是一个完全平方数,再加上168又是一个完全平方数
题目求一个整数加上100后是一个完全平方数,再加上168又是一个完全平方数分析这里给出满足条件的最小整数和所有满足条件的整数 //m ,n 为整数 x+100=m^2 x+100+168=n^2 n^2 - m^2 = 168 (n+m)(n-m) = 168(n+m)(n-m) = 168 从这里可以看出 m和n取值在 [1, 169] 之间代码/** * 找出最小的满足条件的 x * @return */ public st原创 2020-12-23 16:50:34 · 2608 阅读 · 2 评论 -
归并排序——java实现
分析归并排序的思想主要是分而治之,先将数组像二叉树一样拆分成多个,然后对每个部分排序,排序后的数组再逐渐合并到一起。具体分析过程可以看这篇文章(图画的很赞) 归并排序代码 public static void mergeSort(int[] arr){ int len = arr.length; //临时数组存放每段排好序的数组 int[] temp = new int[len]; splitSort(arr, 0, len-1, tem原创 2020-12-12 20:49:21 · 213 阅读 · 2 评论 -
Leetcode53 最大子序和
题目给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。分析代码public static int largestSubArray(int[] a){ if(a == null || a.length == 0){ return 0; } int原创 2020-12-12 17:55:16 · 263 阅读 · 0 评论 -
LeetCode415 字符串相加
题目字符串相加124123142414121431 + 123124151515121 = ?分析双指针两个字符串倒着相加,指针下标为负数数时补0代码public static String addLargeNums(String a, String b){ int len1 = a.length(); int len2 = b.length(); if(len1 == 0){ return b; }原创 2020-12-12 16:59:43 · 205 阅读 · 1 评论 -
LeetCode68 二叉树的最近公共祖先
题目分析复杂度分析:时间复杂度 O(N): 其中 NN 为二叉树节点数;最差情况下,需要递归遍历树的所有节点。空间复杂度 O(N) : 最差情况下,递归深度达到 NN ,系统使用 O(N)O(N) 大小的额外空间剑指 Offer 68 - II. 二叉树的最近公共祖先解答 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root == null || r转载 2020-10-26 02:20:07 · 128 阅读 · 0 评论 -
LeetCode88 合并有序数组
题目/** * ClassName: MergeSortArray <br/> * Function: 合并有序数组<br/> * [1, 2, 2, 5] * [3, 4, 7, 8] * * */分析双指针移动从前往后的比较代码public static int[] mergeSortArray(int[] a, int[] b){ int length1 = a.length, length2 = b.length;原创 2020-12-12 16:18:54 · 1095 阅读 · 2 评论 -
Leetcode257二叉树所有路径及路径和
文章目录题目一:二叉树所有路径分析代码变形: 所有路径和题目描述分析代码结果参考资料题目一:二叉树所有路径/** * ClassName: LeetCode257SumTree <br/> Function: <br/> * * 给定一个二叉树,返回所有从根节点到叶子节点的路径。 * * 说明: 叶子节点是指没有子节点的节点。 * * 输入: * * 1 * / \ * 2 3 * \ * 5 * * 输出:原创 2020-12-12 15:19:13 · 389 阅读 · 2 评论 -
Concurrent 包结构介绍
java 中Concurrent 包下面提供了java的并发编程的一些基本工具,能够使我们更高效写出线程安全的代码,也减少了自己使用不当导致线程死锁的可能。Concurrent 包主要包括 atomic基本类型类,基于AQS各种锁的实现,线程池框架,线程安全的集合类,线程并发控制类(CountDownLatch,CyclicBarrier),future接口实现。结构Concurrent 包下面包含了 atomic 包和 locks 包,还有Concurrent 下面直接的类。atomic 包at原创 2020-11-21 17:56:45 · 1985 阅读 · 7 评论 -
三色球
题目有红、黄、蓝三种颜色的气球。在牛客王国,1个红气球+1个黄气球+1个蓝气球可以兑换一张彩票。2个红气球+1个黄气球可以兑换1个蓝气球。2个黄气球+1个蓝气球可以兑换1个红气球。2个蓝气球+1个红气球可以兑换1个黄气球。现在牛牛有a个红气球,b个黄气球, c个蓝气球,牛牛想知道自己最多可以兑换多少张彩票。示例1:输入1,7,5输出3说明可以用4个黄气球和2个蓝气球换2个红气球,这样就有了3个红气球,3个黄气球,3个蓝气球,可以换3个彩票。备注:0≤a,b,c≤1e9第原创 2020-11-19 01:18:22 · 1000 阅读 · 0 评论 -
leetcode134 加油站
题目在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明:如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为非负数。示例 1:输入: gas = [1,2,3,4,5]cost = [3,4,5,1,2转载 2020-11-18 01:39:38 · 124 阅读 · 0 评论 -
leetCode670 最大交换
题目给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。示例:输入: 2736输出: 7236解释: 交换数字2和数字7。输入: 9973输出: 9973解释: 不需要交换。注意:给定数字的范围是 [0, 108]解法解法一像冒泡排序一样循环和前面固定一位数字比较,如果比前面大就交换,解法二leetcode 给的官方解法思路:代码实现:public static int swap2maxNum(int num) { char[]原创 2020-11-18 00:59:52 · 152 阅读 · 0 评论 -
求m的n次方
方法递归法二分法,不断将n二分有点难得理解,是将n化成二进制,然后把1的那些数位乘起来,我也没看懂可以直接参考 求m的n次方代码实现这里给出递归和二分法的实现 /** * 递归法 * @param m * @param n * @return */ public static Long nthPowerRecursion(int m, int n){ if(n == 0){ return 1L;原创 2020-11-14 12:06:45 · 1573 阅读 · 0 评论 -
多线程顺序打印123
synchronized实现public class OrderPrint { private static Integer num = 1; static class Thread1 implements Runnable{ @Override public void run(){ while (true){ synchronized (this){ if(原创 2020-11-07 17:42:17 · 752 阅读 · 0 评论 -
求树的高度
方法递归求树高度层次遍历记录树高后序遍历,结点最大栈长即为二叉树的高度递归public static int height(TreeNode root){ if(root == null){ return 0; } int m = height(root.getLeft()); int n = height(root.getRight()); return m > n ? m+1 :原创 2020-11-07 17:15:25 · 693 阅读 · 0 评论 -
生成分布式 ID的几种方法
可以直接阅读这篇文章如果再有人问你分布式ID,这篇文章扔给他参考资料如果再有人问你分布式ID,这篇文章扔给他转载 2020-10-26 20:12:49 · 169 阅读 · 0 评论 -
java多线程——ThreadLocal 原理解析
ThreadLocal介绍ThreadLocal可以创建只能由同一线程读取和写入的变量。因此,即使两个线程正在执行相同的代码,并且代码具有对 ThreadLocal变量的引用,那么这两个线程不能看到对方的ThreadLocal变量。实际上ThreadLocal的值是放入了当前线程的一个ThreadLocalMap实例中,所以只能在本线程中访问,其他线程无法访问。可以创建一个指定泛型类型的Thread原创 2017-03-18 20:30:59 · 1024 阅读 · 0 评论 -
Redis 学习
模式redis支持单点,cluster,proxy和sharding四种模式,memcached支持单点,proxy和sharding三种模式。比如Twitter 的 temproxy 模式,水平扩展优势redis这么火,它运行有多快?一台普通的笔记本电脑,可以在1秒钟内完成十万(500K)次的读写操作。1. Redis 原生支持主从复制,可以实现一主多从的场景,提高了可用性2. Redis 原生支持 RDB 和 AOF 两种持久化方式。前者是将内存中的数据整体落地,后者是将数据的更新落地,类似于原创 2020-07-15 01:34:37 · 226 阅读 · 0 评论 -
java并发——锁
分类概念分类公平锁/非公平锁可重入锁排它锁/共享锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁/适应性自旋锁主要是按java中出现的一些锁的概念,下面会具体每一类在java中的具体应用底层实现分类CAS(基于cpu指令)Synchronized (对象头,monitor锁)AQS以上是只是个人感觉,每种的实现原理我的blog中都有,可以参看公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。对于ReentrantLock而言,通过构造函数指定该锁原创 2020-10-07 23:29:54 · 134 阅读 · 0 评论 -
分布式事务
可以直接阅读参考资料中的文章再有人问你分布式事务,把这篇扔给他分布式事务本地事务在我的文章《事务》里已有说到,本文主要介绍分布式事务。分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。分布式事务的基础CAP,base定理可以参考原创 2020-10-07 22:24:12 · 88 阅读 · 0 评论 -
java并发——synchronized浅析
原理部分内容可以直接看这篇文章深入理解Java并发之synchronized实现原理synchronized 用法它的修饰对象有几种:修饰一个类,其作用的范围是synchronized后面括号括起来的部分, 作用的对象是这个类的所有对象。class ClassName { public void method() { synchronized(ClassName.class) { // todo } }}修饰一个方法,被修饰的方法称为原创 2020-10-07 18:22:52 · 183 阅读 · 0 评论 -
java并发——CAS浅谈
CAS,Compare And Swap,即比较并交换。Doug lea大神在同步组件中大量使用CAS技术鬼斧神工地实现了Java多线程的并发操作。整个AQS(抽象队列同步)同步组件、Atomic原子类操作等等都是以CAS实现的,甚至ConcurrentHashMap在1.8的版本中也调整为了CAS+Synchronized。可以说CAS是整个JUC的基石。cas实现CAS(Compare and Swap) 是利用底层硬件平台特性,实现原子性操作的算法,Java 1.5 以后 JUC(java.uti原创 2020-10-07 17:43:10 · 270 阅读 · 0 评论 -
Java多线程——volatile
volatilevolatile修饰的变量在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。Java中的volatile关键字用作Java编译器和Thread的指示符,它们不会缓存此变量的值并始终从主存中读取它。Java在Java内存模型(JMM)中引入了一些变化,它保证了从一个线程到另一个线程的变化的可见性,也就是“happen原创 2017-03-18 17:52:04 · 904 阅读 · 0 评论 -
浅谈分布式系统限流
目的由于 API 接口无法控制调用方的行为,因此当遇到瞬时请求量激增时,会导致接口占用过多服务器资源,使得其他请求响应速度降低或是超时,更有甚者可能导致服务器宕机。限流 (Ratelimiting) 指对应用服务的请求进行限制,例如某一接口的请求限制为 100 个每秒, 对超过限制的请求则进行快速失败或丢弃。限流可以应对:热点业务带来的突发请求;调用方 bug 导致的突发请求;恶意攻击请求。常用限流算法固定窗口计数器固定窗口计数器算法概念如下:将时间划分为多个窗口;在每个窗口内每原创 2020-10-07 16:47:06 · 217 阅读 · 0 评论 -
浅聊负载均衡
负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。解决问题实现负载均衡主要有两个目的。将任务的处理负载均摊到不同的进程,以减少单一进程的负载,以达到处理能力水平扩容的目的。提高容错能力。我们知道,在线上正式环境中,机器宕机或者进程异常导致服务不可用是常有的现象。在实现负载均衡的系统中,多个服务器进程提供同样的服务,一个进程不可用的情况下,任务会被负载均衡器派发到其他可用的进程,以达到高可用的目的。在多台不同的服务器中部署相同原创 2020-10-07 16:23:50 · 368 阅读 · 1 评论 -
Netty线程模型和零拷贝原理
Netty基于NIO实现,Netty在NIO之上又提供了更高层次的抽象。IO 模型是 Reactor,它是一种异步、非阻塞的事件驱动模型。线程模型Reactor单线程模型一个NIO线程+一个accept线程:Reactor多线程模型Reactor主从模型主从Reactor多线程:多个acceptor的NIO线程池用于接受客户端的连接Netty是建立在NIO基础之上,Netty在NIO之上又提供了更高层次的抽象。在Netty里面,Accept连接可以使用单独的线程池去处理,读写操作又是另外原创 2020-10-07 14:50:31 · 501 阅读 · 1 评论 -
Java——NIO浅析
Java NIO: Non-blocking IO(非阻塞IO)一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。NIO解决的问题解决线程池处理海量连接的瓶颈,包括利用面向事件的方式编写服务端/客户端程序。核心组成Channels(通道)标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer原创 2020-10-07 11:49:05 · 313 阅读 · 0 评论 -
Java——IO流
流的理解在很多时候,流(Stream)是字节流(Byte Steram)的简称,也就是长长的一串字节,当然,除了字节流,我们还可以有视频流、音频流、数据流。流只有一个特征就是连续,流可以没有头可以没有尾,甚至可能没有绝对的位置(因为无头无尾),但是由于流是连续的,所以有相对位置。但也有人更倾向于流是类库或执行环境中的数据流概念,而不是编程语言里的概念。这种“流”的典型代表好比Java里的InputS原创 2017-02-18 17:16:14 · 941 阅读 · 0 评论 -
Spring——AOP浅析
aop( aspect oriented programming ) 面向切面编程,是对所有对象或者是一类对象编程,核心是横向的对功能增强,aop实现原理是代理。使用场景多个模块代码重复——》抽出相同代码,各个模块显示调用——》aop可以“动态的”生成一个新的代理类,包含原方法和具有“横切”性质的方法,通过定义切入点而不用显示调用。广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。分类静态代理和动态代理AOP 实现的关键就在于 AOP 框架自动创建的 AOP原创 2020-10-06 23:56:51 · 461 阅读 · 0 评论 -
Spring——IOC浅析
IOCIOC(inverse of controll)控制反转(控制权反转),就是把创建对象(bean),和维护对象(bean)的关系和权力从程序中转移到spring的容器,而程序本身不再关心、维护对象创建和关系。IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。DI(依赖注入)控制反转,或者叫DI(依赖注入)更加形象,DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态原创 2020-10-06 23:25:22 · 154 阅读 · 0 评论 -
消息队列及常见消息中间件
可以直接去看原文:浅谈消息队列及常见的消息中间件简介消息队列 已经逐渐成为企业应用系统 内部通信 的核心手段。它具有 低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。当前使用较多的 消息队列 有 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ 等,而部分 数据库 如 Redis、MySQL 以及 phxsql 也可实现消息队列的功能。消息队列 是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流,并基于 数据通信 来进行分布式系统转载 2020-10-06 21:56:42 · 1161 阅读 · 0 评论 -
分布式锁的几种实现
为何需要分布式锁效率:使用分布式锁可以避免不同节点重复相同的工作,这些工作会浪费资源。比如用户付了钱之后有可能不同节点会发出多封短信。正确性:加分布式锁同样可以避免破坏正确性的发生,如果两个节点在同一条数据上面操作,比如多个节点机器对同一个订单操作不同的流程有可能会导致该笔订单最后状态出现错误,造成损失。分布式锁的一些特点当我们确定了在不同节点上需要分布式锁,那么我们需要了解分布式锁到底应该有哪些特点:互斥性:和我们本地锁一样互斥性是最基本,但是分布式锁需要保证在不同节点的不同线程的原创 2020-10-05 17:06:45 · 306 阅读 · 0 评论 -
MySQL——Lock锁
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。查看锁命令:show status like 'innodb_row_lock%'; 锁分类读锁:也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。写锁:又称排他锁、X锁。若事务T对数据对象A加上X锁,事务T可以读A也可以原创 2020-10-05 16:51:55 · 522 阅读 · 2 评论 -
MySQL——主从复制
MySQL——主从复制以前对 MySQL 作数据分布仅仅是读写分离,通过数据库自身的主从复制即可实现写主库、读从库。现在则需要双写主库并在经历一个短暂的延时后达成最终一致性,这个问题乍一想比较复杂,但归根结底还是数据最终一致性的问题。一个数据库数据一致性保证数据库的事务特性来保证的,具体见blog中《事务》。主从架构之间数据一致性MySQL 为了提供主从复制功能引入了一个新的日志文件叫 binlog,它包含了引发数据变更的事件日志集合。从库请求主库发送 binlog 并通过日志事件还原数据写入从库原创 2020-10-05 16:39:10 · 982 阅读 · 2 评论 -
MySQL——MVVC(多版本并发控制)
MVCC: 多版本并发控制(MVCC,Multiversion Currency Control)。一般情况下,事务性储存引擎不是只使用表锁,行加锁的处理数据,而是结合了MVCC机制,以处理更多的并发问题。Mvcc处理高并发能力最强,但系统开销比最大(较表锁、行级锁),这是最求高并发付出的代价。MVCC实现原理innodb MVCC主要是为Repeatable-Read事务隔离级别做的。在此隔离级别下,A、B客户端所示的数据相互隔离,互相更新不可见了解innodb的行结构、Read-View的结构对于原创 2020-10-05 16:31:02 · 1259 阅读 · 0 评论 -
MySQL——索引原理
MySQL的索引主要是用了B+树B-树B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树 它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图.B-树有如下特点:所有键值分布在整颗树中;任何一个关键字出现且只出现在一个结点中;搜索有可能在非叶子结点结束;在关键字全集内做一次查找,性能逼近二分查找;B+ 树所有关键字存储在叶子节点出现,内部节点(非叶子节点并不存储真正的 data)为所有叶子结点增加了一个链原创 2020-10-05 16:06:09 · 223 阅读 · 0 评论 -
操作系统常见问题
1.操作系统的用户态和核心态切换条件以及为什么要切换进程在用户空间运行时,被称为进程的用户态,而陷入内核空间的时候,被称为进程的内核态。进程通过系统调用进入内核态同个进程用户态和内核态切换条件:发生系统调用时:这是处于用户态的进程主动请求切换到内核态的一种方式。用户态的进程通过系统调用申请使用操作系统提供的系统调用服务例程来处理任务。而系统调用的机制,其核心仍是使用了操作系统为用户特别开发的一个中断机制来实现的,即软中断。产生异常时:当CPU执行运行在用户态下的程序时,发生了某些事先不可知的异常,原创 2020-10-05 15:48:45 · 255 阅读 · 0 评论 -
java——CurrentHashMap
什么时候使用CurrentHashMap在多线程并发向HashMap中put数据时,就需要把HashMap换成ConcurrentHashMap。因为多线程环境下,使用HashMap进行put操作resize会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap.线程安全的使用map结构可以使用HashTable和CurrentHashMap,HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为同步机原创 2020-10-05 12:17:19 · 3314 阅读 · 0 评论 -
Java——JMM 内存模型
JMM 内存模型java内存模型(JMM)是线程间通信的控制机制.JMM定义了主内存和线程之间抽象关系。线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。Java内存模型的抽象示意图如下:jvm内存结构1、虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建。栈里面存着的是一种叫原创 2020-10-05 10:56:49 · 217 阅读 · 1 评论 -
Java——classloader 类加载
Java——classloader 类加载类加载过程类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示:其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持 Java 语言的运行时绑定(也成为动态绑定或晚期绑定)。加载加载时类加载的第一个过程,在这原创 2020-10-05 10:41:45 · 315 阅读 · 1 评论