查找算法

【最长公共前缀】算法优化笔记

旧城冷巷雨未停 提交于 2020-01-21 07:22:28
题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-common-prefix 初步分析 暴力循环嵌套比较得出最长前缀 取第一个string为原值,逐步比较缩短得到最长公共前缀。 详细代码 缩减法 public class Solution { public string LongestCommonPrefix ( string [ ] strs ) { if ( strs . Length == 0 ) return "" ; string strpublic = strs [ 0 ] ; for ( int i = 0 ; i < strs . Length ; i ++ ) { while ( strs [ i ] . IndexOf ( strpublic ) != 0 ) { strpublic = strpublic . Substring ( 0 , strpublic . Length - 1 ) ; }

蓝桥杯算法题之基础算法查找整数 Java代码为例

余生长醉 提交于 2020-01-21 01:47:22
蓝桥杯算法题 基础算法之查找整数 问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。 输入格式 第一行包含一个整数n。 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。 第三行包含一个整数a,为待查找的数。 输出格式 如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。 样例输入 6 1 9 4 8 3 9 9 样例输出 2 数据规模与约定 1 <= n <= 1000。 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。 输入格式 第一行包含一个整数n。 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。 第三行包含一个整数a,为待查找的数。 输出格式 如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。 样例输入 6 1 9 4 8 3 9 9 样例输出 2 数据规模与约定 1 <= n <= 1000。 import java . util . Scanner ; public class Main { public static void main ( String [ ] args ) { Scanner scanner = new Scanner ( System . in ) ; int num = scanner .

Trie--字典树

允我心安 提交于 2020-01-20 21:26:36
Trie--字典树 在计算机科学中, trie ,又称 前缀树 ,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。 Trie 这个术语来自于 re trie val。根据词源学,trie 的发明者 Edward Fredkin 把它读作 / ˈ t r iː / "tree"。但是,其他作者把它读作 / ˈ t r aɪ / "try"。 在图示中,键标注在节点中,值标注在节点之下。每一个完整的英文单词对应一个特定的整数。Trie 可以看作是一个 确定有限状态自动机 ,尽管边上的符号一般是隐含在分支的顺序中的。 键不需要被显式地保存在节点中。图示中标注出完整的单词,只是为了演示 trie 的原理。 trie 中的 键通常是字符串 ,但也可以是其它的结构。trie 的算法可以很容易地修改为处理其它结构的有序序列,比如一串数字或者形状的排列。比如, bitwise trie 中的键是一串位元,可以用于表示整数或者内存地 Trie树 是一种 哈希树的变种 ,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串)

JavaScript-字符串常用方法

不打扰是莪最后的温柔 提交于 2020-01-20 00:38:43
字符串对象 基本包装类型 基本包装类型就是把简单数据类型包装成复杂数据类型,这样基本数据类型就有了属性和方法 // 对象才有属性和方法 复杂数据类型才有属性和方法 // 简单数据类型为什么会有length 属性呢? // 基本包装类型: 就是把简单数据类型包装成为了复杂数据类型 var str = 'andy'; console.log(str.length); //按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,但是上面代码却可以执行,这是因为js会把基本数据类型包装成复杂数据类型,其执行过程如下: // (1) 生成临时变量,把简单数据类型包装为复杂数据类型 var temp = new String('andy'); // (2) 把临时变量的值 给 str str = temp; // (3) 销毁这个临时变量 temp = null; 字符串的不可变 指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间。(不要大量对字符串进行赋值和大量拼接字符串这样做很占内存空间的) 字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串。 根据字符返回位置 indexOf()方法返回在字符串中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。 语法: arr.indexOf(要查找的字符

线性表之顺序表

拜拜、爱过 提交于 2020-01-19 10:12:12
线性表的定义 由n(n>=0)个数据特性相同的元素构成的有限序列称为 线性表 。 线性表中元素的个数n(n>=0)定义为线性表的长度,n=0时称为 空表 。 对于 非空的 线性表或线性结构,其特点是: 1.存在唯一的一个被称作“第一个”的数据元素; 2.存在唯一的一个被称作“最后一个"的数据元素; 3.除第一个之外,结构中的每个数据元素均只有一个前驱; 4.除最后一个之外,结构中的每个元素均只有一个后驱。 线性表的顺序表示和实现 线性表的顺序表示指的是用一组地址连续的存储单元一次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为 顺序表 。(特点:逻辑上相邻的数据元素,其物理次序也是相邻的) 假设线性表的每个元素需占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储起始位置。则线性表中的第i+1个数据元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足下列关系: LOC(ai+1)=LOC(ai)+l 一般来说,线性表的第i个数据元素ai的存储位置为: LOC(ai)=LOC(ai)+(i-)*l 线性表的顺序存储结构示意图如下 由此可知,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机选取,所以线性表的顺序存储结构是一种 随机存取 的存储结构。 由于线性表的长度可变

Day 3

依然范特西╮ 提交于 2020-01-18 22:30:55
STL VECTOR动态数组 语句 定义方式:vector a; 在末尾压入容器:a.push_back(x); 在末尾弹出容器:a.pop_back(); 清空容器:a.clear(); 查询元素个数:a.size(); 首指针:a.begin(); 插入元素在sit位置:a.insert(sit,x);其中sit是vector的迭代器。 其它像数组一样调用就可以了。 看做是一个动态数组 复杂度 访问,添加啥的都是 \(o(1)\) ,但是常数比较大 栈和队列 语句 定义:stack a; 查询栈顶:a.top(); 压入栈顶:a.push(x); 将元素从栈顶弹出:a.pop(); 查询a中的元素个数:a.size(); 清空只能慢慢pop。 队列 定义:queue a; 插入队尾:a.push(x); 删除队首:a.pop(); 查询队尾:a.back(); 查询队首:a.front(); 查询长度:a.size(); 清空只能慢慢pop。 用栈写队列WTF 因为进栈出栈的时间复杂度都是O(1)的 加入的时候先进A再进B 时间复杂度为O(n) MAP •映射,把它看做一个无限大的数组。 •定义方式:map<int ,int> a; •使用方式:a[x]++,cout<<a[y]等。 •利用迭代器查询map里的所有二元组: •for (map<int,int>:

09-07 元类

∥☆過路亽.° 提交于 2020-01-18 15:55:11
[TOC] 一 元类介绍 插图:恶搞图47 什么是元类呢?一切源自于一句话:python中一切皆为对象。让我们先定义一个类,然后逐步分析 class StanfordTeacher(object): school='Stanford' def __init__(self,name,age): self.name=name self.age=age def say(self): print('%s says welcome to the Stanford to learn Python' %self.name) 所有的对象都是实例化或者说调用类而得到的(调用类的过程称为类的实例化),比如对象t1是调用类StanfordTeacher得到的 t1=StanfordTeacher('lili',18) print(type(t1)) #查看对象t1的类是<class '__main__.StanfordTeacher'> 如果一切皆为对象,那么类StanfordTeacher本质也是一个对象,既然所有的对象都是调用类得到的,那么StanfordTeacher必然也是调用了一个类得到的,这个类称为元类 于是我们可以推导出===>产生StanfordTeacher的过程一定发生了:StanfordTeacher=元类(...) print(type(StanfordTeacher)) #

09-03 继承与派生

断了今生、忘了曾经 提交于 2020-01-18 09:50:08
[TOC] 一 继承介绍 插图:恶搞图22 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,新建的类可称为子类或派生类,父类又可称为基类或超类 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承 pass class SubClass2(ParentClass1,ParentClass2): #多继承 pass 通过类的内置属性__bases__可以查看类继承的所有父类 >>> SubClass2.__bases__ (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>) 插图:恶搞图23 在Python2中有经典类与新式类之分,没有显式地继承object类的类,以及该类的子类,都是经典类,显式地继承object的类,以及该类的子类,都是新式类。而在Python3中,即使没有显式地继承object,也会默认继承该类,如下 >>> ParentClass1.__bases__ (<class ‘object'>,) >>> ParentClass2.__bases__ (<class 'object'>,)

查找三 哈希表的查找

馋奶兔 提交于 2020-01-16 10:45:59
目录 要点 哈希表和哈希函数 在记录的存储位置和它的关键字之间是建立一个确定的对应关系(映射函数),使每个关键字和一个存储位置能 唯一对应 。这个映射函数称为 哈希函数 ,根据这个原则建立的表称为 哈希表(Hash Table) ,也叫 散列表 。 以上描述,如果通过数学形式来描述就是: 若查找关键字为 key ,则其值存放在 f(key) 的存储位置上。由此, 不需比较便可直接取得所查记录 。 注:哈希查找与线性表查找和树表查找最大的区别在于,不用数值比较。 冲突 若 key1 ≠ key2 ,而 f(key1) = f(key2),这种情况称为 冲突 (Collision)。 根据哈希函数f(key)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这一映射过程称为 构造哈希表 。 构造哈希表这个场景就像汽车找停车位,如果车位被人占了,只能找空的地方停。 构造哈希表 由以上内容可知,哈希查找本身其实不费吹灰之力,问题的关键在于如何构造哈希表和处理冲突。 常见的构造哈希表的方法有 5 种: (1)直接定址法 说白了,就是小学时学过的 一元一次方程 。 即 f(key) = a * key + b。其中,a和b 是常数。 (2)数字分析法 假设关键字是R进制数(如十进制)。并且哈希表中

负载均衡基本原理与lvs

心已入冬 提交于 2020-01-16 08:54:57
前言:   之前在山西的项目上使用的是lvs下的NAT模式,但另外两个模式并没有涉及,今天系统的整理下关于负载均衡的相关理论与lvs各模式的相关优点与不足,知其然与所以然,而后能针对性的应用: 基本介绍 1.1 负载均衡的由来 在业务初期,我们一般会先使用单台服务器对外提供服务。随着业务流量越来越大,单台服务器无论如何优化,无论采用多好的硬件,总会有性能天花板,当单服务器的性能无法满足业务需求时,就需要把多台服务器组成集群系统提高整体的处理性能。不过我们要使用统一的入口方式对外提供服务,所以需要一个流量调度器通过均衡的算法,将用户大量的请求均衡地分发到后端集群不同的服务器上。这就是我们后边要说的 负载均衡。 1.2 负载均衡的优点 提高了服务的整体性能 提高了服务的扩展性 提高了服务的高可用性 1.3 负载均衡的类型 广义上的负载均衡器大概可以分为 3 类,包括:DNS 方式实现负载均衡、硬件负载均衡、软件负载均衡。 1.3.1 DNS负载均衡 DNS 实现负载均衡是最基础简单的方式。一个域名通过 DNS 解析到多个 IP,每个 IP 对应不同的服务器实例,这样就完成了流量的调度,虽然没有使用常规的负载均衡器,但也的确完成了简单负载均衡的功能。 通过 DNS 实现负载均衡的方式的优点: 实现简单,成本低,无需自己开发或维护负载均衡设备, 通过 DNS 实现负载均衡的方式的缺点: