遍历

Java_集合面试题

亡梦爱人 提交于 2019-12-25 06:07:07
Java_集合面试题 0.链表,队列和栈的区别? 链表是一种存储结构,指得是存储时候除了要存储数据元素之外,还要用数据元素一起的另外空间存储数据元素的关系。 队列和栈都是线性表,属于逻辑结构范畴,都是访问点受到限制,并且限制在线性表端点的线性表。 栈被限定为在线性表中的同一个(唯一一个的)端点插入删除 队列被限定为在线性表的一端插入,另外一个端点删除 栈和队列也可以用链表来实现,分别称为链栈和链队列 1. ArrayList ArrayList是基于数组实现的,最大长度不会超过数组的长度2147483647(最大值是int的最大值是,2的31次方减去1 ).如果业务中可能存在超过这个长度的数据,使用LinkedArrayList 3.HashMap Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。 HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。 4.HashMap和HashTable的区别

泛型真的会降低性能吗?

被刻印的时光 ゝ 提交于 2019-12-25 03:50:20
在《 .NET,你忘记了么?(八)—— 从dynamic到特性误用 》一文中, 飞林沙 同学提到,使用泛型会略微降低程序性能,因此在程序中使用List<Object>是不合理的行为,应该使用ArrayList。这一点和老赵平时的观点相悖,老赵一直提倡,在.NET 2.0之后,要尽可能使用List<T>,情愿是List<Object>也不要使用ArrayList。不过个中原因与性能无关,我们稍候再叙述。飞同学的文章让我有了将泛型与非泛型进行性能比较的想法。这个比较非常容易,不过也得出了一些非常有意思的结论。 泛型容器与非泛型容器的性能比较 首先,我们来比较一种最“纯粹”的泛型容器,它的目的是避免程序的其他方面对性能的影响。因此,这里我们构造两个最简单的容器,就是简单的模仿ArrayList和List<T>: public class MyArrayList { public MyArrayList(int length) { this.m_items = new object[length]; } public object[] m_items; public object this[int index] { get { return this.m_items[index]; } set { this.m_items[index] = value; } } public

Python期末复习

喜夏-厌秋 提交于 2019-12-25 00:20:01
Python期末总复习 基本数据类型 数字类型 字符串类型 布尔类型 数据类型的转换 基本输入和输出 运算符 算术运算符 比较运算符 赋值运算符 逻辑运算符 位运算符 运算符的优先级 Python程序控制结构 Python分支结构 单分支结构 二分支结构 多分支结构 条件判断及组合 Python循环结构 遍历循环 无限循环 循环控制保留字 Python组合数据类型 列表与元组 序列 列表 元组 字典 集合 字符串 字符串类型的格式化 函数 函数定义: 参数 lambda函数 map函数 filter函数 reduce函数 sorted函数 函数递归 文件及操作目录 打开读取或创建文件的方式 open函数模式参数表 操作 Python异常处理 异常检测 基本数据类型 概念: 数据类型 就是数据的类型。 分类:数字类型、字符串类型、布尔类型 重点是数据类型的转换 数字类型 包括:整数、浮点数、复数 字符串类型 概念:字符串是连续的字符序列,可以是计算机所能表示的 一切字符 的集合 转义字符:指使用 “\” 对一些特殊字符进行转义。 布尔类型 判断正确与否 True: 1 Flase:0 可用于运算当中。 数据类型的转换 基本输入和输出 variable = input(‘输入文字’) print(‘输出内容’) 运算符 算术运算符 比较运算符 赋值运算符 逻辑运算符 位运算符

CopyOnWriteArrayList理解与理解

元气小坏坏 提交于 2019-12-24 13:04:38
CopyOnWriteArrayList,因何而存在? ArrayList的一个线程安全的变体,其所有可变操作( add 、 set 等)都是通过对底层数组进行一次新的复制来实现的,代价昂贵。 CopyOnWriteArrayList,是因”并发”而生。 CopyOnWriteArrayList,改了其中的某对象的某个值, 【场景一】对于ArrayList,使用直接方式,一边遍历,一边删除,会报错。 // 删除/修改元素 for(String item : list){ list.remove(item); } 解决办法一:使用迭代器,一边遍历,一边删除,不会报错。 // 删除/修改元素 Iterator<String> it = list.iterator(); while(it.hasNext()){ String ele = it.next(); it.remove(); } http://blog.sina.com.cn/s/blog_605f5b4f0100qsgf.html 解决办法二: 使用CopyOnWriteArrayList,直接方式,一边遍历,一会删除,不会报错。 for(String item : list){ list.remove(item); } 【场景二】对于ArrayList,使用迭代器,一边遍历,一边add,会报错。 Iterator

for each.遍历集合或数组使用

和自甴很熟 提交于 2019-12-24 11:06:18
package seday11; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collection; /** * @author xingsir * JDK5之后推出了一个特性:增强for循环也称为新循环,for each. * 新循环不是用来取代传统for循环的操作,而仅用来遍历集合或数组使用。 */ public class NewForDemo { public static void main(String[] args) { int[] num= {1,2,3,4,5}; for(int i=0;i<num.length;i++ ) { int k=num[i]; System.out.println(k); } for(int k:num) { System.out.println(k); Collection c = new ArrayList(); c.add("1"); c.add("2"); c.add("3"); c.add("4"); c.add("5"); System.out.println(c); /* * 编译器会将新循环遍历集合改为迭代器遍历,所以在遍历的过程中不能通过集合的方法增删元素 */ for(Object o:c) {

重建二叉树--python

蓝咒 提交于 2019-12-24 10:56:03
#4.重建2叉树 #输入二叉树的前序遍历和中序遍历的结果,重建出该二叉树 #前序遍历--根-->左-->右 中序遍历--左-->根-->右 后序遍历--左-->右-->根 #二叉树特例:①二叉搜索树--左子结点小于等于根结点,右子结点大于等于根结点②堆--分为最大堆和最小堆。在最大堆中根结点值最大,在最小堆中根结点值最小 class TreeNode : def __init__ ( self , x ) : self . val = x self . left = None self . right = None # 前序遍历 pre = [ 1 , 2 , 4 , 7 , 3 , 5 , 6 , 8 ] #中序遍历 mid = [ 4 , 7 , 2 , 1 , 5 , 3 , 8 , 6 ] def findBinaryTree ( pre , pre_start , pre_end , mid , mid_start , mid_end ) : if pre_start > pre_end or mid_start > mid_end or len ( pre ) == 0 or len ( mid ) == 0 : return None #前序遍历第一个为根结点 root = TreeNode ( pre [ pre_start ] ) #循环遍历中序遍历

select、poll和epoll的比较

蓝咒 提交于 2019-12-24 07:25:40
一、select机制   在linux下网络通信中,经常用到select机制,这是一种异步通信的实现方式,select中提供一fd_set的数据结果, 实际上是一个long类型的数组 , 每一个数组元素都能与一打开的文件句柄建立联系,通常这个句柄并不局限于网络通信中的socket句柄,还包括其他文件、命名管道或设备句柄等。 当程序中调用select()时,由内核 根据IO状态修改fd_set的内容,由此来通知执select()的进程哪一Socket或文件可读或者可写。    select的本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是:   1、单个进程可监视的fd数量受到了限制,在32位机器上,他所能管理的fd数量最大为1024。   2、 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。   3、 对socket进行扫描时是线性扫描,当socket文件描述符数量变多时,大量的时间是被白白浪费掉的。 二、poll机制   poll是 Linux中的字符设备驱动 中有一个函数,Linux 2.5.44版本后已经被epoll所取代。 poll机制是用在某些Unix系统中,使用poll()函数用于执行与select()函数同等功能的函数。    poll本质上和select没有区别

模糊测试工具设计思路浅谈

左心房为你撑大大i 提交于 2019-12-24 05:45:30
一、说明 去年写了一篇“ 模糊测试(fuzzing)是什么 ”,在最后提到可以自己手动编写实现模糊测试工具,但一直没把可行的代码放上来。 其实这不是光说不练没实现,而是在去年就着手编写了,并在前段时间发现参数未做防呆处理导致设备重启上收到了很好的效果,只是一是说代码涉及产品具体业务需要进行处理二是说对之前做到一半没做完的事时常缺乏兴趣回头继续做。 二、模糊测试中的几个关键问题讨论 2.1 如何标识模糊测试项 标识模糊测试项有两大思路:一类是sqlmap的无标识思路,另一类是burpsuite的有标识思路。 sqlmap无标识思路:自动分析数据中的参数,然后逐个参数进行测试;优点是使用方便,缺点是如果协议的结构性越差则其参数分析逻辑就要越复杂且不能只测试指定的参数。如sqlmap -d "username=admin&password=abcd1234" -u "http://192.168.1.1/login",此时sqlmap就会分析出username和password两个参数然后进行测试。 burpsuite的有标识思路:直接使用额外标志标识出要测试的位置;优点是不需要复杂的参数解析代码能测试指定的位置(不过注意其实burpsuite是有参数分析代码的),缺点是需要用户手动标识出要测试的位置当api很多时是一项不小的工作量

《剑指offer》-重建二叉树

百般思念 提交于 2019-12-24 03:24:00
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路:以下面的树结构进行前序和中序举例。 那么前序中的A就是最终的根节点,根据中序遍历规则,可以知道中序遍历中A左侧的节点都是A的左子树节点,A的右边就是A的右子树节点,见下图:在中序遍历中遍历,寻找‘A’节点,而A左侧的是左子树、A右侧的是右子树,而左子树的个数就是前序A后面的节点个数。 将A的左子树当做一个树结构,而重建这个树结构就是重复上一步的工作。 在中序中,寻找左子树的根节点B,重复上面的工作。循环就可以得到结果。 代码: /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { return

python列表元组的总结

梦想与她 提交于 2019-12-23 20:41:53
列表 2.1.什么是列表 列表是具有顺序的数据容器。又称之为序列。该容器是可以修改的 2.2.列表语法 1.变量 = [数据1, 数据2, 数据3, 数据4…] #具有数据的列表 2变量 = list() #空列表 1.通过[] 定义一个列表或者使用list()内置方法生成; 2.列表中每个数据也被称为元素,每个元素通过,分割; 3.列表中的每个数据都有对应的索引,该索引就是元素在 列表 中的位置编号,索引也可以被称为 下标,该索引从0开始,依次递增; 案例: name = [ '小乔' , '大乔' , '貂蝉' ] #名字列表 age = [ 17 , 18 , 19 ] #名字列表 score = [ 90 , 99 , 100 ] #成绩列表 2.3.为什么使用列表 可以将多个数据值放到同一个列表中方便按照进行管理和操作。 2.4.列表函数速查 2.5.1添加 2.5.1.追加 在列表末尾追加数据 语法: 列表.append(数据) score = [ 70 , 90 , 88 ] #成绩表 score . append ( 99 ) #将99添加到末尾 print ( score ) 运行结果: [60, 79, 90, 99] 2.5.2.插入 语法: 列表.insert(索引,数据) score = [ 89 , 77 , 90 ] score . insert (