next

java:合并两个排序的链表(递归+非递归)

♀尐吖头ヾ 提交于 2021-02-20 19:55:11
//采用不带头结点的链表 非递归实现 public static ListNode merge(ListNode list1,ListNode list2){ if(list1==null) return list2; else if(list2==null) return list1; ListNode newHead=null; ListNode tmp=null; //往新链表一个个添加节点 直至有一个链表为空 //tmp存放最后一个添加进新链表的节点 用于后续的拼接 while(list1!=null&&list2!=null){ if(list1.value<list2.value){ if(newHead==null){ newHead=tmp=list1; }else{ tmp.next=list1; tmp=tmp.next; } list1=list1.next; }else{ if(newHead==null){ newHead=tmp=list2; }else{ tmp.next=list2; tmp=tmp.next; } list2=list2.next; } } //拼接剩余链表至新链表尾节点 if(list1==null){ tmp.next=list2; }else{ tmp.next=list1; } return newHead; } /

Java链表和递归

99封情书 提交于 2021-02-20 19:54:56
删除链表的指定元素: public class ListNode { public int val; public ListNode next; public ListNode(int x){ val=x; } //链表节点的构造函数 //使用arr为参数,创建一个链表,当前的ListNode为链表头节点 public ListNode(int arr[]){ if(arr==null||arr.length==0) throw new IllegalArgumentException("arr can not be empty"); this.val=arr[0]; ListNode cur=this; for(int i=1;i<arr.length;i++){ cur.next=new ListNode(arr[i]); cur=cur.next; } } //以当前节点为头节点的链表信息字符串 @Override public String toString(){ StringBuilder res=new StringBuilder(); ListNode cur=this; while(cur!=null){ res.append(cur.val+"->"); cur=cur.next; } res.append("NULL"); return res.toString

windows 下安装MongoDB

南楼画角 提交于 2021-02-20 11:52:10
一:下载mongodb安装包 下载地址: https://www.mongodb.com/download-center/community 这里推荐下载msi的安装包 二:安装mongodb 双击下载下来的mongodb安装包进行安装 在Windows下安装软件十分的简单,只需要next就可以了,只需要注意点下面两点 1:如下图安装界面中选择自定义安装,这里可以选择您的安装目录,这里我选择的安装目录为:D:\MongoDB 2:取消如下图形界面管理工具勾选,勾选的话安装会十分十分的慢,如果您想要安装的话可以访问: https://www.mongodb.com/download-center/compass 进行下载安装 如下是mongodb安装后的目录结构 三:mongodb配置 安装号mongodb之后我们需要进行mongodb配置 1:启动mongodb服务 使用命令行进入mongodb安装目录的bin目录下执行 mongod --dbpath " D:\MongoDB\data " #D:\MongoDB\data为我安装的mongodb目录下的data目录,用户存储数据 运行如上名利之后在浏览器上访问:localhost:27017(27017为mongodb的默认端口号) 2:配置本地windows mongodb服务 1:在安装的根目录下新建一个mongod

AQS源码复习笔记

血红的双手。 提交于 2021-02-20 08:50:25
仅为个人复习笔记,格式之类的未调整,明天抽空再整下。 1、acquire函数 // 首先调用子类的tryAcquire函数,执行具体的操作 // 如果失败了,执行addWaiter 加入阻塞队列尾部 // 接着执行acquireQueued 尝试再次检查前面的线程是不是完事了,自旋再尝试一下 public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); } // 这个函数的特点,就是会设置一个哨兵节点,负责放哨,比如说标记下后面的节点是不是有需要唤醒的, // 如果后面是有节点需要唤醒的 那么这个哨兵节点的值就是SIGAL private Node addWaiter(Node mode) { Node node = new Node(Thread.currentThread(), mode); // Try the fast path of enq; backup to full enq on failure Node pred = tail; if (pred != null) { node.prev = pred; if (compareAndSetTail(pred, node)) {

汇编语言-环境搭建

点点圈 提交于 2021-02-20 08:40:30
MS-DOS环境安装 安装Vmware,并下载MS-DOS镜像。(AMD要启用SVM) 安装MS-DOS镜像 一路Next,重装完毕后会报错 这是BIOS启动设置的问题,按CTRL+ALT+INSERT重启虚拟机,在vm出现logo时按F2(把握好时间,多试几次),进入BIOS设置,向右键(→)切换到Boot栏,向下键(↓)选择到CD-ROM Drive(变白即为选中),然后按SHIFT和加号(+),将其移动到最顶端。向右键(→)切换到Exit栏,选中“Exit Saving Changes”,按两次回车,保存设置并重启。 继续一路Next,然后这一步不选择“Install Add-Ons”(在选项上按空格即可取消选择),“Next” 这一步选择“Enable both UMB and EMS” 选择“Load both” 选择“Use default” 选择“Continue” 然后会提示你是否重启,在重启之前,将连接改为使用物理驱动器,然后重启,不然会一直重装。 重启成功 masm和link编译文件 DOS本身并没有自带这两个软件,需要我们将masm这个文件夹放到DOS里面。先关闭DOS,然后右键进入设置,选择“硬盘”,在右面的“硬盘实用工具中”,点击“映射”。去掉“以只读模式打开文件”的选择,点击确定。 这时会自动打开该磁盘(如果没打开在我的电脑中可以找到该磁盘)

Prime Path[POJ3126] [SPFA/BFS]

安稳与你 提交于 2021-02-20 03:00:59
描述 孤单的zydsg又一次孤单的度过了520,不过下一次不会再这样了。zydsg要做些改变,他想去和素数小姐姐约会。 所有的路口都被标号为了一个4位素数,zydsg现在的位置和素数小姐姐的家也是这样,如果两个路口间只差1个数字,则有一条路连通两个路口。(例如1033和1073间有一条路连接) 现在,你知道了zydsg的位置和素数小姐姐的家,问最少zydsg要走多少条路才能见到素数小姐姐。例如:如果zydsg在1033,素数小姐姐的家在8179,最少要走6条街,走法为: 1033 1733 3733 3739 3779 8779 8179 Input 输入数据有多组,首先是一个数字n,代表之后有n组数据。 其次,在每一组输入中,都包含两个数字a和b,代表zydsg的位置和素数小姐姐家的位置。 其中,a和b都是四位数,而且不含前导0。 Output 每组输入输出一行,表示zydsg最少需要走多少条路。若不存在合法的路径,则输出单词“Impossible”。 Sample Input 3 1033 8179 1373 8017 1033 1033 Sample Output 6 7 0 分析 首先我们要筛素数,接下来 方法一: 两个“相邻的”素数连边,每次从开头向终点跑SPFA 方法二: 按个十百千位向四周扩散,BFS 代码(SPFA) 1 #include< set > 2

Vue3.0源码结构分析

房东的猫 提交于 2021-02-20 02:41:45
“关注 前端开发社区 ,回复“ 1” 即可加入 前端技术交流群,回复 “ 2” 即可免费领取500G前端干货! Vue3.0源码结构分析 首先我们对vue的源码结构进行说明,搞懂每个文件夹里面代表啥,这样才能有针对性的去分析,学习。 Vue 源码地址:https://github.com/vuejs/vue-next Vue2与Vue3的对比 对 TypeScript 支持不友好(所有属性都放在了 this 对象上,难以推倒组件的数据类型) 大量的API挂载在Vue对象的原型上,难以实现 TreeShaking 。 架构层面对跨平台dom渲染开发支持 不友好 CompositionAPI 。受 ReactHook 启发 对 虚拟DOM 进行了 重写 、对模板的编译进行了优化操作... 项目结构 clone 下来的源码结构如下: reactivity :响应式系统 runtime-core :与平台无关的运行时核心 (可以创建针对特定平台的运行时 - 自定义渲染器) runtime-dom : 针对浏览器的运行时。包括DOM API,属性,事件处理等 runtime-test :用于测试 server-renderer :用于服务器端渲染 compiler-core :与平台无关的编译器核心 compiler-dom : 针对浏览器的编译模块 compiler-ssr :

据说程序员最怕命名!这个 6300 Star 的手册能帮上忙

安稳与你 提交于 2021-02-19 12:07:26
【导语】:naming-cheatsheet 是一个命名备忘录,记录命名的一些常见规范和约定。 简介 在编程工作中,命名是一件让很多开发者都头疼的事情。国外曾经有个一次关于程序员最难任务的投票调查,结果命名占了 49%。 一个好的变量或函数命名,应该能起到自解释的作用,甚至能减少我们代码的注释。 naming-cheatsheet是一个命名备忘录,记录一些常见的规范约定,并提供简单的例子说明。如果能够严格遵守这些规范,相信我们的代码可读性会大大提升,下面就来介绍 naming-cheatsheet 提供的一些建议。 项目地址: https://github.com/kettanaito/naming-cheatsheet 使用英语 这是最基本的一条规则了,英语是编程中的主要语言,所有编程语言的语法都是用英语编写的,通过英语编写代码,可以大大提高其通用性。对于我们国内开发者来说,一定要避免拼音甚至是直接的中文命名。 /* Bad */ const primerNombre = 'Gustavo' const amigos = ['Kate', 'John'] /* Good */ const firstName = 'Gustavo' const friends = ['Kate', 'John'] 命名风格 选择一种命名的风格,并且严格遵守,可以是camelCase,或者snake

java nio详解

蹲街弑〆低调 提交于 2021-02-19 11:41:58
NIO简介 NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。 NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 NIO提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发。 NIO的特性/NIO与IO区别 如果是在面试中回答这个问题,我觉得首先肯定要从 NIO 流是非阻塞 IO 而 IO 流是阻塞 IO 说起。然后,可以从 NIO 的3个核心组件/特性为 NIO 带来的一些改进来分析。如果,你把这些都回答上了我觉得你对于 NIO 就有了更为深入一点的认识,面试官问到你这个问题,你也能很轻松的回答上来了。 1、Non-blocking IO(非阻塞IO) IO流是阻塞的,NIO流是不阻塞的。 Java

栈------表达式求值

99封情书 提交于 2021-02-19 08:38:04
栈的应用---表达式求值 1.简单计算器 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。 Output 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。 Sample Input 1 + 2 4 + 2 * 5 - 7 / 11 0 Sample Output 3.00 13.36 Source 浙大计算机研究生复试上机考试-2006年 #include <iostream> #include <stack> #include < string > #include <cstdio> using namespace std; stack < double > opnd; // 运算对象栈 stack< char > optr; // 运算符号栈 void f() // 取栈顶元素运算 { double tmp; char key= optr.top(); optr.pop(); double x= opnd.top(); opnd.pop(); double y= opnd.top(); opnd.pop(); switch