next

leetcode剑指 Offer 06(从尾到头打印链表)--Java语言实现

∥☆過路亽.° 提交于 2020-08-11 22:57:24
求: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000 题目链接: https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/ 解: 非常常规的题目,因为题目的特点是先进后出,所以联想到栈,先遍历链表,将值放入栈中,最后再从栈中弹出元素,逐个加入ret数组。最后返回ret数组。 时间复杂度:O(n) 空间复杂度:O(n) public int [] reversePrint (ListNode head) { Deque<Integer> helpStack = new LinkedList<>() ; for (ListNode p = head ; p != null; p = p. next ) helpStack.push(p. val ) ; int size = helpStack.size() ; int ret[] = new int [size] ; for ( int k = 0 ; k < size ; k++) ret[k] = helpStack.pop() ; return ret ; } 如果不用栈也可以做,这样可以省去栈的空间

剑指 Offer 06. 从尾到头打印链表

有些话、适合烂在心里 提交于 2020-08-11 22:32:25
题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 输入: head = [1,3,2] 输出: [2,3,1] 解题思路:利用栈的先进后出的特点 Stack<ListNode> res = new Stack<ListNode> (); 依次遍历链表 temp = temp.next; 入栈 res.push(); 出栈 res.pop().val; 栈的长度 len = res.size(); 最后创建一个 数组 依次将栈中数出栈放进 数组中。 来源: oschina 链接: https://my.oschina.net/u/3887243/blog/4486096

200行代码,7个对象——让你了解ASP.NET Core框架的本质

别等时光非礼了梦想. 提交于 2020-08-11 21:42:08
2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为《ASP.NET Core框架揭秘》的分享。在此次分享中,我按照ASP.NET Core自身的运行原理和设计思想创建了一个 “迷你版” 的ASP.NET Core框架,并且利用这个 “极简” 的模拟框架阐述了ASP.NET Core框架最核心、最本质的东西。整个框架涉及到的核心代码不会超过200行,涉及到7个核心的对象。 PPT下载 源代码下载 目录 1. 从Hello World谈起 2. ASP.NET Core Mini 3. Hello World 2 4. 第一个对象:HttpContext 5. 第二个对象:RequetDelegate 6. 第三个对象:Middleware 7. 第四个对象:ApplicationBuilder 8. 第五个对象:Server 9. HttpContext和Server之间的适配 10. HttpListenerServer 11. 第六个对象:WebHost 12. 第七个对象:WebHostBuilder 13. 回顾一下Hello World 2 14. 打个广告:《ASP.NET Core框架揭秘》 1、从Hello World谈起 当我们最开始学习一门技术的时候都喜欢从Hello World来时,貌似和我们本篇的主题不太搭。但事实却非如此

JS----封装简易版jQuery

寵の児 提交于 2020-08-11 21:38:28
自己封装简易版的Jquery ( function () { function jQuery (selector) { return new jQuery.prototype.init(selector); } jQuery.prototype.init = function (selector) { // this = {}; // 选出 dom 并且包装成jQuery对象 返回 // id class this .length = 0 ; // null undefined dom if (selector == null ) { return this ; } if ( typeof selector == 'string' && selector.indexOf('.') != -1 ) { var dom = document.getElementsByClassName( selector.slice(1 ) ); } else if ( typeof selector == 'string' && selector.indexOf('#') != -1 ) { var dom = document.getElementById( selector.slice(1 ) ); } if (selector instanceof Element || dom.length

设计模式(17) 迭代器模式

穿精又带淫゛_ 提交于 2020-08-11 21:36:20
迭代器模式 基于IEnumerable的实现 使用场景 迭代器模式的优缺点 迭代器模式 迭代器模式用于顺序访问集合对象的元素,而不需要知道集合对象的底层表示。Java和.Net等语言已经将迭代器作为其内部语法元素,比如在C#中,集合对象只需要实现IEnumberable接口,然后就可以用foreach来遍历了。 迭代器模式提示我们要从使用者的角度考虑如何设计接口,如何对外提供访问内部对象的方式。即便我们组织的对象系统内部结构很复杂,但对于客户程序而言最简单的方式莫过于通过for /foreach循环依次遍历,至于遍历过程中的次序、分类筛选等则由目标类型自己封装。 GOF对迭代器模式描述为: Provide a way to access the elements of an aggregate objectsequentially without exposing its underlying representation. — Design Patterns : Elements of Reusable Object-Oriented Software UML类图: 代码实现 //迭代器接口 public interface IIterator<T> { T Next(); bool HasNext(); } //具体迭代器 public class

聊聊dubbo-go的leastActiveLoadBalance

无人久伴 提交于 2020-08-11 21:06:36
序 本文主要研究一下dubbo-go的leastActiveLoadBalance leastActiveLoadBalance dubbo-go-v1.4.2/cluster/loadbalance/least_active.go const ( // LeastActive ... LeastActive = "leastactive" ) func init() { extension.SetLoadbalance(LeastActive, NewLeastActiveLoadBalance) } type leastActiveLoadBalance struct { } // NewLeastActiveLoadBalance ... func NewLeastActiveLoadBalance() cluster.LoadBalance { return &leastActiveLoadBalance{} } leastActiveLoadBalance的NewLeastActiveLoadBalance方法创建leastActiveLoadBalance Select dubbo-go-v1.4.2/cluster/loadbalance/least_active.go func (lb *leastActiveLoadBalance) Select(invokers

常见问题

旧巷老猫 提交于 2020-08-11 20:56:17
1、wpf和winform的区别? 2、委托和事件的区别? 委托的本质bai,是一个类,而du事件,是一个委托类型的私有zhi变量加上两个公有方法dao(事件的+=和-=),这是本质区别。 打个比方,string 也是一个类,而string s = "a",这个s是string类型的一个变量(略有不恰当,为了方便直观理解)。 public delegate void myDel();相当于你创建了一个myDel的类,所以委托可以在任何地方创建,类需要实例化,所以委托需要实例化,要myDel m = ……; 申明一个事件 public event myDel myEvent; 事件myEvent是一个myDel类型的一个变量,因为是变量,所以事件只能在类里面申明,不需要实例化,有点类似与上面的那个m,当然不全是,他还有两个方法(+=,-=),调用一次+=方法,myEvent += MethodA;其实是把MethodA方法,封装成一个myDel类型的委托对象,然后把这个对象的引用赋值给这个myEvent变量。如果多次调用+=,就是多个方法封装成了多个myDel委托对象,然后这些委托对象放在一个列表里面,然后myEvent就指向这个列表,触发的时候,就是调用这个列表里面的所有委托的Invoke方法。 上述是编译时他们的本质区别,用法上的区别主要就是事件只能在申明他的这个类里面调用触发

Python3的简介

那年仲夏 提交于 2020-08-11 20:55:38
Python3简介 Python3与Python2之间是不兼容的,而且其中的差异性比较大。其实Python是linux上最常用的软件之一,但是linux目前的版本大部分还是使用Python2的,而且,在linux上依赖Python2的程序更多一些,所以 Python3 要代替 Python2 成为主流还需要几年的时间。 我建议: 如果是你在企业中,需要用到Python而学习Python的话,那就要看企业的应用Python的版本进行学习; 如果想要更多的成熟解决方案,最少的bug,最稳定的应用那就用Python2 ; 如果你是在读大学的学生,那我建议你学习Python3,等到毕业的时候或许Python已经成为了主流。 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。 Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。 Python 是交互式语言: 这意味着,您可以在一个 Python 提示符 >>> 后直接执行代码。 Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。 Python 是初学者的语言:Python 对初级程序员而言

(三)学习了解OrchardCore笔记——灵魂中间件ModularTenantContainerMiddleware的第一行①的模块部分

醉酒当歌 提交于 2020-08-11 20:49:55
  了解到了OrchardCore主要由两个中间件(ModularTenantContainerMiddleware和ModularTenantRouterMiddleware)构成,下面开始了解ModularTenantContainerMiddleware中间件第一行代码。   了解asp.net core机制的都知道中间件是由构造函数和Invoke(或者InokeAsync)方法构成,构造函数不过就是个依赖注入的过程,Invoke也可以直接依赖注入,两者的区别是构造函数时全局的,Invoke只是当次请求,所以从Inovke开始了解! public async Task Invoke(HttpContext httpContext) { // Ensure all ShellContext are loaded and available. await _shellHost.InitializeAsync(); var shellSettings = _runningShellTable.Match(httpContext); // We only serve the next request if the tenant has been resolved. if (shellSettings != null ) { if (shellSettings.State ==

阿里java规范“不要在 foreach 循环里进行元素的 remove/add 操作,remove 元素请使用 Iterator 方式”

两盒软妹~` 提交于 2020-08-11 20:32:19
先来看一段代码,摘自阿里巴巴java开发规范: List < String > list = new ArrayList < > ( ) ; list . add ( "1" ) ; list . add ( "2" ) ; for ( String item : list ) { if ( "1" . equals ( item ) ) { list . remove ( item ) ; } } 可以发现是可以执行的,但事实上循环只执行了一次便停止了(原因在下文讲述),但如果要删除"2",便会报如下错误: 这个错误是指存在并发修改,通常在多线程下会出现,但单线程也会出现,本文的错误是因为***迭代器和list集合在同时操作集合内的内容,发生冲突***。 foreach是增强版的for,代码简洁,其底层实现是通过迭代器实现的。为了分析代码,将class文件反编译如下: List list = new ArrayList ( ) ; list . add ( "1" ) ; list . add ( "2" ) ; Iterator i$ = a . iterator ( ) ; do { if ( ! i$ . hasNext ( ) ) break ; String temp = ( String ) i$ . next ( ) ; if ( "1" . equals (