遍历

ES6 - Generator生成器

谁都会走 提交于 2020-03-11 11:02:34
基本概念 Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个 状态机 ,封装了多个内部状态。 执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。 Generator 函数是一个普通函数,但是有两个特征。一是, function 关键字与函数名之间有一个星号;二是,函数体内部使用 yield 表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)。 function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator(); 调用 Generator 函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象 下一步,必须调用遍历器对象的 next 方法,使得指针移向下一个状态。也就是说,每次调用 next 方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个 yield 表达式(或 return 语句)为止。换言之,Generator 函数是分段执行的,yield表达式是 暂停

02.07、链表相交

泪湿孤枕 提交于 2020-03-11 10:10:59
这道题主要的问题在于两条链表长度不同,而且是按照地址来确定相交点的。我刚开始的想法是将两个链表的值分别扔进vector里,然后倒着遍历,当出现不同时,+1就是相交点。想一想定义一个 vector<ListNode*>这样应该可以 这道题有一个很巧的做法,就是定义头节点,让它们对面条链表都进行遍历,这样就很巧的消除了这两条链表的长度差。 意思就是first先对A链表进行遍历 second先对B进行遍历。当短的那条遍历完后,将它再对长的那条遍历,长的那条遍历完后对短的那条遍历。这样就很巧的消除长度差,两个节点遍历的长度都是两条链表长度和。这样找到交叉点就很简单。 /** Definition for singly-linked list. struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; */ class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode* first=headA; ListNode* second=headB; while(first!=second) { if(first!= NULL) first=first

02 树的各种遍历(递归与非递归的先中后序遍历,层次遍历)

旧时模样 提交于 2020-03-11 09:51:03
二叉树的前中后遍历,递归与非递归 struct TreeNode { int val ; TreeNode * left ; TreeNode * right ; TreeNode ( int x ) : val ( x ) , left ( NULL ) , right ( NULL ) { } } ; 递归 先序遍历: void PreOrderTraversal ( TreeNode * root ) { if ( ! root ) { return ; } cout << root - > val << " " ; PreOrderTraversal ( root - > left ) ; PreOrderTraversal ( root - > right ) ; } 中序遍历 void InOrderTraversal ( TreeNode * root ) { if ( ! root ) { return ; } InOrderTraversal ( root - > left ) ; cout << root - > val << " " ; InOrderTraversal ( root - > right ) ; } 后序遍历 void PostOrderTraversal ( TreeNode * root ) { if ( ! root ) { return

JAVA中ListIterator和Iterator详解与辨析

孤街浪徒 提交于 2020-03-11 04:26:45
在使用 Java 集 合的时候,都需要使用Iterator。但是java集合中还有一个迭代器ListIterator,在使用List、ArrayList、 LinkedList和Vector的时候可以使用。这里有一点需要明确的时候,迭代器指向的位置是元素之 前的位置,如下图所示:   这里假设集合List由四个元素List1、List2、List3和List4组成,当使用语句Iterator it = List.Iterator()时,迭代器it指向的位置是上图中Iterator1指向的位置,当执行语句it.next()之后,迭代器指向的位置后 移到上图Iterator2所指向的位置。 首先看一下Iterator和ListIterator迭代器的方法有哪些。 Iterator迭代器包含的方法有: hasNext():如果迭代器指向位置后面还有元素,则返回 true ,否则返回false next():返回集合中Iterator指向位置后面的元素 remove():删除集合中Iterator指向位置后面的元素 ListIterator迭代器包含的方法有: add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置 之前 hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回 true ,否则返回false hasPrevious():如果以逆向遍历列表

【数据结构与算法之美】二叉树基础(上):什么样的二叉树适合用数组来存储?

心已入冬 提交于 2020-03-11 03:22:47
一、树 1.树的常用概念 根节点、叶子节点、父节点、子节点、兄弟节点,还有节点的高度、深度以及层数,树的高度。 2.概念解释 节点:树中的每个元素称为节点 父子关系:相邻两节点的连线,称为父子关系 根节点:没有父节点的节点 叶子节点:没有子节点的节点 父节点:指向子节点的节点 子节点:被父节点指向的节点 兄弟节点:具有相同父节点的多个节点称为兄弟节点关系 节点的高度:节点到叶子节点的最长路径所包含的边数 节点的深度:根节点到节点的路径所包含的边数 节点的层数:节点的深度+1(根节点的层数是1) 树的高度:等于根节点的高度 二、二叉树 1.概念 ①什么是二叉树? 每个节点最多只有2个子节点的树,这两个节点分别是左子节点和右子节点。 ②什么是满二叉树? 有一种二叉树,除了叶子节点外,每个节点都有左右两个子节点,这种二叉树叫做满二叉树。 ③什么是完全二叉树? 叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大,这种二叉树叫作完全二叉树 2.完全二叉树的存储 ①链式存储 每个节点由3个字段,其中一个存储数据,另外两个是指向左右子节点的指针。我们只要拎住根节点,就可以通过左右子节点的指针,把整棵树都串起来。这种存储方式比较常用,大部分二叉树代码都是通过这种方式实现的。 ②顺序存储 用数组来存储,对于完全二叉树,如果节点X存储在数组中的下标为i

Vue和React中的diff算法核心

不羁岁月 提交于 2020-03-11 01:41:35
虚拟DOM js对象替代真实DOM, 更改避免回流(重新渲染),一次性通过render函数渲染成真实DOM 声明的样子 输出的样子 实现render函数生成真实DOM 设置属性 render函数 渲染函数 diff算法 diff算法其实就是对DOM进行different比较不同的一种算法(虚拟的比较更节约性能) __ 补丁:用来更新DOM的任务__ 比较原则 平级对比 不跨级对比(无A__删除__A) 同级复用 遍历规则 先序深度优先遍历(从根节点向下级子节点遍历) 125叫广度优先 12345深度优先 实现diff函数 比较思路规则 type相同,比较属性,属性不同生成补丁包patch {type:'ATTRS',attrs:{class:'xx'} } 新节点在原DOM中不存在 {type:'REMOVE',index:xxx} 节点类型不同,直接替换 {type:'REPLACE',newNode:xxx} 文本变化 {type:'TEXT',text:'xxx'} 来源: CSDN 作者: 凃老师 链接: https://blog.csdn.net/tjx11111/article/details/104779101

层次遍历二叉树

≯℡__Kan透↙ 提交于 2020-03-11 01:14:24
想看更多 队列简介 对于一些资源调度问题,FIFO的方法比较常用,比如操作系统的页面置换算法,在一些具体场景里(银行、医院等排队功能当然优先考虑用队列去实现了) 除此之外,队列还可以用于二叉树的层次遍历。 层次遍历的想法 1. 根节点加入队列 2. 进入循环,出口条件是队列为空 3. 出一个节点,并且把他的左右子加入队列 4.可以用一个特殊的#号代表换行,最开始根和#入队,当#出队的时候新加入一个#到队尾 代码 (用一个数组去模拟了队列) void display_biTree(biTree* root) { //模拟一个 Queue(biTree) biTree queue[20]; int head; int tail; head =0 ; tail = 1 ; queue[0] = *root; queue[1].data = -1; for(head=0;head<20;head++) { //左右入自己出 if(queue[head].data != -1) { printf(" %d ",queue[head].data); if(queue[head].leftSon !=NULL) { queue[tail+1] = *queue[head].leftSon; tail ++ ; } if(queue[head].rightSon != NULL) { queue

数据结构

自闭症网瘾萝莉.ら 提交于 2020-03-10 22:16:20
数据结构学习 数据结构简介 线性结构 树 图 散列查找 排序 数据结构简介 维基百科:数据结构是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最有效率的算法。 数据结构:涵盖(1)数据对象(2)其组织方式[逻辑存储、物理存储](3)操作集(4)实现操作的最高效算法 解决问题的效率与数据的组织方式有关,跟空间利用效率有关,也与算法的巧妙程度有关。 “数据结构”包括数据对象集以及它们在计算机中的组织方式,即它们的逻辑结构和物理存储结构,同时还包括与数据对象集相关联的操作集,以及实现这些操作的最高效的算法。抽象数据类型是用来描述数据结构的重要工具。 “算法”是解决问题步骤的有限集合,通常用某一种计算机语言进行伪码描述。我们用时间复杂度和空间复杂度来衡量算法的优劣,用渐进表示法分析算法复杂度的增长趋势。 线性结构 数据的组织方式:(1)逻辑结构:线性、树、图 (2)物理存储结构:数组、链表 线性表 :是由同一类型的数据元素构成的有序序列的线性结构 线性表:顺序存储实现;链式存储实现 广义表:是线性表的推广,元素不仅可以是单元素也可以是另一个广义表;多重链表:存在结点属于多个链的链表,指针域会有多个(双向链表不是多重链表)。 堆栈 :具有一定约束的线性表,插入和删除操作都作用在一个称为栈顶的端点位置。 队列 :具有一定操作约束的线性表,只能在一端插入,而在另一端删除。

go range详解

好久不见. 提交于 2020-03-10 13:32:29
1. 前言 range是Golang提供的一种迭代遍历手段,可操作的类型有数组、切片、Map、channel等,实际使用频率非常高。 探索range的实现机制是很有意思的事情,这可能会改变你使用range的习惯。 2. 热身 按照惯例,我们看几个有意思的题目,用于检测对range的了解程度。 2.1 题目一:切片遍历 下面函数通过遍历切片,打印切片的下标和元素值,请问性能上有没有可优化的空间? func RangeSlice(slice []int) { for index, value := range slice { _, _ = index, value } } 程序解释: 函数中使用for-range对切片进行遍历,获取切片的下标和元素素值,这里忽略函数的实际意义。 参考答案: 遍历过程中每次迭代会对index和value进行赋值,如果数据量大或者value类型为string时,对value的赋值操作可能是多余的,可以在for-range中忽略value值,使用slice[index]引用value值。 2.2 题目二:Map遍历 下面函数通过遍历Map,打印Map的key和value,请问性能上有没有可优化的空间? func RangeMap(myMap map[int]string) { for key, _ := range myMap { _, _ = key,

PHP中的对象遍历技巧

随声附和 提交于 2020-03-10 08:22:52
PHP中的对象遍历 对象的遍历,主要是指遍历对象中的,对外部可见属性。实际上就是用访问限制符public声明的属性,这点大家肯定很熟悉了。并且,在php中,遍历对象居然与遍历数组一样,都可以用使用foreach语句。 好,下面用实例来说明: <?php class Demo { public $name; public $age; public $salary; public function __construct($name,$age,$salary) { $this->name = $name; $this->age = $age; $this->salary = $salary; } } //访问 $obj = new Demo('peter', 28, 3800); foreach ($obj as $key=>$value) { echo $key.'=>'.$value.'<br>'; } 访问结果是: name=>peter age=>28 salary=>3800 但是一个对象中,很多时候,还有私有属性和受保护的属性,这些属性外部是不可访问,那么应该如何遍历呢?很简单,尽管这些属性外部不可见,但是在类的内部都是可见的。我们只要在类的内部,声明一个公共方法,用来遍历类中所有属性,然后在类的外部,访问这个方法,就可以获取到对象的全部属性了,包括私有的和受保护的属性。