遍历

剑指offer面试题 - 05 替换空格

限于喜欢 提交于 2019-12-18 01:39:55
替换空格 题目描述 请实现一个函数,把字符串中的每个空格替换成"%20"。例如,输入 “We are happy.”,输出“We%20are%20happy.” 分析 显然,最直观的解法就是从头到尾遍历输入字符串,遇到空格则进行替换,但是由于替换后的"%20"是3个字符,而原本的空格只有1个字符,替换过程中必然会出现需要将空格后的字符向后移动的情况。例如输入“We are happy.”进行第一个空格替换时,"are happy."需要向后移动两个位置,而进行第二个空格的替换时,"happy."又需要移动一次,也就是说每个空格的替换都会导致其后面的字符发生一次移动。对于长度为n的字符串,包含O(n)个空格,每个空格的替换导致其后面O(n)个字符的移动,其时间复杂度为O(n^2)。 为了降低时间复杂度,我们可以考虑从后向前进行替换。首先遍历一遍输入字符串记录空格的数量,这样就可以计算得到替换后字符串的长度。然后用两个索引idOld, idNew分别指示原始字符串与输入字符串的元素下标,初始化为字符串各自的最后一个下标。接着从后向前,若原始字符串idOld位置不是空格,则赋值给新字符串对应idNew位置;否则,则从后向前向新字符串赋值’0’, ‘2’, ‘%’。这一过程要注意每次对新字符串赋值后索引idNew都要递减1,遍历原始字符串idOld位置的元素后也要对idOld递减1. C+

java遍历

佐手、 提交于 2019-12-17 22:01:29
map是已key和value的形式存储数据 map添加数据 map.put(“1”,“测试”); map删除数据 map.remove(“1”);//删除数据是已keyq去定位数据。 map循环有3种方式(核心都是以entry去遍历) Map<Integer,String> map=new HashedMap(); map.put(1,“张三”); map.put(2,“李四”); map.put(3,“王五”); //第一张遍历 直接foreach for(Map.Entry<Integer,String> entry:map.entrySet()){ System.out.println(entry.getKey()); System.out.println(entry.getValue()); } //第二种遍历 分别遍历key和value for (Integer key:map.keySet() ) { System.out.println(key); } for (String value:map.values() ) { System.out.println(value); } //第三种遍历 使用迭代器iterator Iterator<Map.Entry<Integer,String >> iterator=map.entrySet().iterator();

python基础之——3、控制流if、for、while

北战南征 提交于 2019-12-17 20:23:53
什么是流程控制:都可以控制代码的走向 常见的控制流标志:if for while break continue 一.if判断 二.for遍历 三.while遍历 一.if判断 1.格式 if 判断条件表达式: 执行体 elif 另一个条件表达式: 执行体 else: 执行体 欢迎加微信huahua1416784330交流,请做好备注 2.执行规律 1)从最开始的条件执行,如果条件满足,就执行执行体,其他条件分支就不会运行了 2)如果多个条件又重合的,那么只会执行最开始符合条件的部分 3)if...if 并行存在,(2个if之间需要空行,容易看)上面的if执行对下面的if执行毫无影响 age = input('请输入年龄: ') if int(age) > 18: print(1) if int(age) < 8: print(2) else: print(3) 补充:判断数据类型函数,isinstance() 比type()灵活 isinstance('a',(int,tuple,str) 满足后面其中一种即返回True 默认值设置:name or other。先bool(name),如果前面为真,直接取name。如果为False,取后面那个。优势在于可以少写if else判断,因为永远都是True。让代码少一层逻辑判断,简洁明了 name = [] a = name or '张飞

网络爬虫基本原理以及抓取策略了解

…衆ロ難τιáo~ 提交于 2019-12-17 14:53:54
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 网络爬虫是捜索引擎抓取系统的重要组成部分。爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份。这篇博客主要对爬虫以及抓取系统进行一个简单的概述。 一、网络爬虫的基本结构及工作流程 一个通用的网络爬虫的框架如图所示: 网络爬虫的基本工作流程如下: 1.首先选取一部分精心挑选的种子URL; 2.将这些URL放入待抓取URL队列; 3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。 4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。 二、从爬虫的角度对互联网进行划分 对应的,可以将互联网的所有页面分为五个部分: 1.已下载未过期网页 2.已下载已过期网页:抓取到的网页实际上是互联网内容的一个镜像与备份,互联网是动态变化的,一部分互联网上的内容已经发生了变化,这时,这部分抓取到的网页就已经过期了。 3.待下载网页:也就是待抓取URL队列中的那些页面 4.可知网页:还没有抓取下来,也没有在待抓取URL队列中,但是可以通过对已抓取页面或者待抓取URL对应页面进行分析获取到的URL,认为是可知网页。 5.还有一部分网页

标准库

烂漫一生 提交于 2019-12-17 10:29:18
//STL // vector // :对大小的控制,重新配置时的数据移动效率,vector动态增加大小,是以原大小的两倍另外配置一块较大的空间,将内容拷贝过来,在原内容之后构造新元素,释放原空间。 #include<vector> using namespace std; //1. 声明及初始化 vector<int> a; //声明一个int型向量a vector<int> a(10); //声明一个初始大小为10的向量 vector<int> a(10,1); //声明一个初始大小为10且初始值都为1的向量 vector<int> b(a); //声明并用向量a初始化向量b vector<int> b(a.begin(), a.begin()+3); //将a向量中从第0个到第2个(共3个)作为向量b的初始值 int n[] = {1, 2, 3, 4, 5}; vector<int> a(n, n+5); //将数组n的前5个元素作为向量a的初值 vector<int> a(&n[1], &n[4]); //将n[1] - n[4]范围内的元素作为向量a的初值 //2. 添加元素 vector<int> a; a.push_back(1); //在尾部加入一个数据 a.pop_back(); //删除最后一个数据 a.insert(a.begin(), 0); //在a

二叉树的前序、中序、后序遍历(递归、非递归)实现

寵の児 提交于 2019-12-17 08:37:21
本文部分来源于CSDN 兰亭风雨 大牛的原创。链接为 http://blog.csdn.net/ns_code/article/details/12977901 因为感觉大牛讲的很好,所以这里的文字讲解采用大牛的,大家可以直接看原创!代码部分是我自己的,leetcode代码,可在leetcode Accepted 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有前、中、后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的)。下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍历方式的非递归实现 一、三种遍历方式的递归实现(比较简单,这里不详细讲解) 1、先序遍历——按照“根节点-左孩子-右孩子”的顺序进行访问 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution {

js中数组遍历for与for in区别(强烈建议不要使用for in遍历数组)

笑着哭i 提交于 2019-12-17 05:30:35
转自: http://www.cnblogs.com/javaee6/p/4142270.html?utm_source=tuicool&utm_medium=referral js中遍历数组的有两种方式 1 2 3 4 5 6 7 8 9 var array=[ 'a' ] //标准的for循环 for (var i= 1 ;i<array.length;i++){ alert(array[i]) } //foreach循环 for (var i in array){ alert(array[i]) } 正常情况下上面两种遍历数组的方式结果一样。首先说两者的第一个区别 标准的for循环中的i是number类型,表示的是数组的下标,但是foreach循环中的i表示的是数组的key是string类型,因为js中一切皆为对象。自己试试 alert(typeof i);这个区别是小问题。现在我加上如下代码,上面的执行结果就不一样了。 1 2 3 4 //扩展了js原生的Array Array.prototype.test=function() } 试试看上面的代码执行什么。我们发现标准的for循环任然真正的对数组循环, 但是此时foreach循环对我刚才写的test方法写打印出来了。这就是for与foreach遍历数组的最大区别,如果我们在项目采用的是用foreach遍历数组

爬虫的基本框架

戏子无情 提交于 2019-12-17 04:37:49
最近看过不少讲爬虫的教程[1][2],基本都是一个模式: 开始先来拿正则、lxml、jquery/pyquery等等教大家从页面上抠出一个一个的值来 然后深入一些在讲讲http 协议,讲讲怎么拿出 cookie 来模拟登录之类的,讲讲基本的反爬虫和反反爬虫的方法 最后在上一个 简单地 scrapy 教程,似乎就皆大欢喜了。 具体地采集一个一个的数据的确让人产生成就感,然而这些教程却都忽略了爬虫最核心的逻辑抽象,也就是「爬虫应该采取什么样的策略遍历网页」。其实也很简单,只需要两个队列和一个集合,Scrapy 等框架拆开来看也是如此,本文参照 Scrapy 实现一个最基础的通用爬虫。 万维网是由一个一个的页面构成的,而每个页面和页面之间是由链接来联系的,并且这些链接都是具有方向性的。对应到数据结构的话,我们可以把每一个页面都看作一个节点,而每一个链接都是一个有向边,也就是整个万维网其实是一个巨大的「有向图」[3]。说到这里,可能有的同学已经明白了,可以用广度优先或者深度优先的算法来遍历这个图。当然,这个图是在太巨大了,我们不可能遍历整个图,而是加一些限定条件,只去访问其中很小一部分我们感兴趣的节点,比如某个域名下的网页。 广度优先和深度优先都可以使用递归或者辅助的队列(queue/lifo_queue)来实现。然而如果你的爬虫是用 python 写的话,很遗憾不能使用递归来实现了

C#实现在foreach遍历中删除集合中的元素(方法总结)

拟墨画扇 提交于 2019-12-17 04:28:30
文章目录 方法一:采用for循环,并且从尾到头遍历 方法二:使用递归 方法三:通过泛型类实现IEnumerator 在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。 集合已修改;可能无法执行枚举操作。 方法一:采用for循环,并且从尾到头遍历 如果从头到尾正序遍历删除的话,有些符合删除条件的元素会成为漏网之鱼; 正序删除举例: List < string > tempList = new List < string > ( ) { "a" , "b" , "b" , "c" } ; for ( int i = 0 ; i < tempList . Count ; i ++ ) { if ( tempList [ i ] == "b" ) { tempList . Remove ( tempList [ i ] ) ; } } tempList . ForEach ( p = > { Console . Write ( p + "," ) ; } ) ; 控制台输出结果:a,b,b,c 有两个2没有删除掉; 这是因为当i=1时,满足条件执行删除操作,会移除第一个b,接着第二个b会前移到第一个b的位置,即游标1对应的是第二个b。 接着遍历i=2,也就跳过第二个b。 用for倒序遍历删除,从尾到头 List

C++图

a 夏天 提交于 2019-12-17 02:58:06
一、图的逻辑结构 1、在线性表中,元素个数可以为零,称为空表; 在树中,结点个数可以为零,称为空树; 在图中,顶点个数不能为零,但可以没有边。 2、一般情况下,图中的路径不惟一。 3、连通分量:非连通图的极大连通子图称为连通分量。 1).含有极大顶点数; 2). 依附于这些顶点的所有边。 二、图的抽象数据类型定义 1、图的遍历操作 从图中某一顶点出发,对图中所有顶点访问一次且仅访问一次。 选取遍历的起始顶点:从编号小的顶点开始 在线性表中,数据元素在表中的编号就是元素在序列中的位置,因而其编号是唯一的; 在树中,将结点按层序编号,由于树具有层次性,因而其层序编号也是唯一的; 在图中,任何两个顶点之间都可能存在边,顶点是没有确定的先后次序的,所以,顶点的编号不唯一。 为了定义操作的方便,将图中的顶点按任意顺序排列起来,比如,按顶点的存储顺序。 多次调用从某顶点出发遍历图的算法,解决从某个起点始可能到达不了所有其它顶点的问题 因图中可能存在回路,某些顶点可能会被重复访问。可附设访问标志数组visited[n] ,来避免遍历不会因回路而陷入死循环 在图中,一个顶点可以和其它多个顶点相连,当这样的顶点访问过后,使用深度优先遍历和广度优先遍历,选取下一个要访问的顶点 2、图的存储结构及其实现 基本思想: 用一个一维数组存储图中顶点的信息 用一个二维数组(称为邻接矩阵