指针

【LeetCode】27. 移除元素

邮差的信 提交于 2020-01-27 22:39:12
题目链接: 27. 移除元素 题目描述: 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例 1: 给定 nums = [3,2,2,3] , val = 3 , 函数应该返回新的长度 2,并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nums = [0,1,2,2,3,0,4,2] , val = 2 , 函数应该返回新的长度 5,并且 nums 中的前五个元素为0, 1, 3, 0, 4。 注意这五个元素可为任意顺序。 你不需要考虑数组中超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下: // nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝 int len = removeElement(nums, val); // 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。 for (int

线性表(二)

∥☆過路亽.° 提交于 2020-01-27 21:58:49
单链表 线性表链式存储结构的特点是:用一种任意的存储单元存储线性表的存储元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个数据元素ai与其直接后继数据元素a i+1之间的逻辑关系,对数据元素来说,除了存储其本身的信息之外,还需存储一个指示其直接后续的信息(即直接后续的存储位置)。这两部分信息组成数据元素ai的存储映像,称为结点。它包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。指针域中存储的信息称为指针或链。n个结点(ai(1<=i<=n)的存储印象)链结成一个链表,即为 线性表 (a1,a2,a3..................an) 的链式存储结构。又由于此链表的每一个结点中只包含一个指针域,故又称 线性链表 或 单链表。 根据链表结点所含的指针个数、指针指向和指针连接方式,可将链表分为 单链表、****循环链表 和 双向链表 用于实现线性表的链式存储结构,其他形式多用于实现树和图等非线性结构。 下面对首原结点、头结点、头指针三个容易混淆的概念加以说明 首原结点 是指链表中存储第一个数据元素a1的结点。 头结点 是在首元结点之前附设的一个结点,其指针域指向首元结点。头结点的数据域可以不存储任何信息,也可存储与数据元素类型相同的其他附加信息。 头指针 是指向链表中第一个结点的指针。若链表设有头结点

[学习笔记]AC自动机

和自甴很熟 提交于 2020-01-27 21:57:06
AC自动机 Aho-Corasick automaton 本文基本上是oiwiki的复制粘贴: https://oi-wiki.org/string/ac-automaton/ 可能加上了自己感性理解 概述 AC 自动机是 以 TRIE 的结构为基础 ,结合 KMP 的思想 建立的 建立AC自动机有两个步骤: TRIE:将所有的模式串构成一颗字典树 KMP:对TRIE上所有的状态构造失配指针 可以说,AC自动机是由字典树和失配指针构成的 回顾KMP KMP匹配算法可以在线性时间内判定字符串 \(A[1-N]\) 是字符串 \(B[1-M]\) 的子串,并求出字符串A在字符串B中各次出现的位置.有两个数组: \(next,f​\) \(next[i]​\) 表示的是 A中以i为结尾的非前缀子串 与 A的前缀 能够匹配的最长 长度 \(f[i]​\) 表示的是 B中以i为结尾的子串 与 A的前缀 能够匹配的最长 长度 一直说AC自动机就是树上的KMP,那这两者有什么关系呢? 字典树 insert() 字典树上的每个节点代表有限自动机一个状态,表示的是某个模式串的前缀。 编译原理学得超级差..( 模式串的结尾状态被称为 可接受状态 字典树的插入: void insert(char *s){ int u=0; for(int i=1;s[i];++i){ if(!tr[u][s[i]-'a

数据结构复习 ---- 链表(一)

大憨熊 提交于 2020-01-27 16:47:00
一、链表相关的定义 什么是链表 : 链表是为了表示每个数据元素a i 与其直接后继元素a i+1 之间的逻辑关系,对数据元素a i 来说,除了存储本身的信息之外,还需要存储一个指示其直接后继的信息(即直接后继的存储位置)。我们把存储数据元素信息的域称为 数据域 ,把存储直接后继位置的域称为 指针域 。指针域中存储的信息被称为指针或者链。这两部分信息组成数据元素a i 的存储映像,称为节点(Node)。 n个节点(a i 的存储映像)链接成一个链表,即为线性表(a 1 ,a 2 ,…,a n )的链式存储结构,因为此链表的每个节点中只包含一个指针域,所以叫单链表。 链表的重要组成 头指针 :链表中第一个结点或头结点的存储位置叫做头指针;它具有标识作用,常用头指针冠以链表的名字;无论链表是否为空,头指针均不为空,它是链表的必要元素; 头结点 :单链表第一个结点前设置的一个结点叫做头结点(为了方便操作),其数据域一般无意义,也可以存放链表的长度;其不一定是链表的必要元素; 二、链表的代码描述 1.节点结构定义 typedef struct LinkList { ElemType data ; //数据域,ElemType指代数据类型 struct LinkList * next ; //指针域 } Node ; 2.链表的读取 思路:声明一个指针p,使其指向链表的第一个节点

ca30a_demo_C++_指针和const限定符_特殊的指针E0349

无人久伴 提交于 2020-01-27 15:04:55
/*30_C++_指针和const限定符txwtech 特殊的指针 1.指向const常对象的指针 2.const指针,一旦指向一个对象,就不可以修改,不能指向其它的 3.指向const对象的const指针,//定义时必须初始化。数据不可以修改。 指针和typedef 理解复杂的const类型声明 例如: const dobule pi=3.14159; //---1 const dobule *p;// p普通指针,dobule类型是个常量,指向常量的double(普通p->常double) //---2 (一旦指向一个对象,就不可以修改,不能指向其它的) double *const p=π//p是常指针,指向的double,double不是常量(常p->普通double) //---3 const double *const p=π//p是常指针,指向常量的double的常指针(常p->常double) */ cout << "ps:" << *ps << endl;/ /没有添加#include <string> //cout << "ps:" << s << endl;//严重性 代码 说明 项目 文件 行 禁止显示状态 //错误(活动) E0349 没有与这些操作数匹配的 "<<" 运算符 ca30a_demo C : \Users\TT2018\Documents

使用双指针可能只需要遍历一趟哦(洛谷P1147题题解,Java语言描述)

好久不见. 提交于 2020-01-27 14:57:51
题目要求 P1147题目链接 分析 Java没有指针的概念,但我们也不是用的C的指针。这里的指针是指两个数值,代表区间的两个索引,利用双指针的移动表示区间的收缩或者扩张,借此找到所求的解。 我们定义两个int变量 i 和 j 来代表一个区间左右边界的索引 tempSum是指当前区间内所有数值的和。 当tempSum小于目标值M时,将右端点右移(j++),然后改变tempSum的值,即tempSum会变大; 当tempSum大于目标值M时,将左端点右移(i++),然后改变tempSum的值,即tempSum会变小。 在双指针移动的过程中,如果有tempSum==M的情况就将其添加到List里面,等最后输出。 因为两个指针整体是向右移动,也只扫一遍,效率比较高。 左端点大于m/2时就停止,因为只要长度为2的连续序列和就一定大于m,肯定不符合要求,不必浪费时间。 具体的设计还是需要仔细看的: AC代码(Java语言描述) import java . util . LinkedList ; import java . util . List ; import java . util . Scanner ; public class Main { public static void main ( String [ ] args ) { Scanner scanner = new

FIFO知识点小结

老子叫甜甜 提交于 2020-01-27 07:58:06
1. FIFO简介 FIFO是一种先进先出数据缓存器,它与普通存储器的区别是没有外部读写地址线,使用起来非常简单,缺点是只能顺序读写,而不能随机读写。 2. 使用场景 数据缓冲:也就是数据写入过快,并且间隔时间长,也就是突发写入。那么通过设置一定深度的FIFO,可以起到数据暂存的功能,且使得后续处理流程平滑。 时钟域的隔离:主要用异步FIFO。对于不同时钟域的数据传输,可以通过FIFO进行隔离,避免跨时钟域的数据传输带来的设计和约束上的复杂度。比如FIFO的一端是AD,另一端是PCI;AD的采集速率是16位100KSPS,每秒的数据量是1.6Mbps。而PCI总线的速度是33MHz,总线宽度是32位 用于不同宽度的数据接口。例如单片机是8位,DSP是16。 3. 分类 同步FIFO:指读时钟和写时钟是同一个时钟 异步FIFO:指读写时钟是不同的时钟。 4. FIFO的常见参数 FIFO的宽度:即FIFO一次读写操作的数据位; FIFO的深度:指的是FIFO可以存储多少个N位的数据(如果宽度为N)。 满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。 空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出

面试精选:链表问题集锦 转

两盒软妹~` 提交于 2020-01-27 07:53:23
原文:http://wuchong.me/blog/2014/03/25/interview-link-questions/ 链表问题在面试过程中也是很重要也很基础的一部分,链表本身很灵活,很考查编程功底,所以是很值得考的地方。我将复习过程中觉得比较好的链表问题整理了下。 下面是本文所要用到链表节点的定义: struct Node{ int data; Node* next;}; 1. 在O(1)时间删除链表节点 题目描述: 给定链表的头指针和一个节点指针,在O(1)时间删除该节点。[Google面试题] 分析: 本题与《编程之美》上的「从无头单链表中删除节点」类似。主要思想都是「狸猫换太子」,即用下一个节点数据覆盖要删除的节点,然后删除下一个节点。但是如果节点是尾节点时,该方法就行不通了。 代码如下: //O(1)时间删除链表节点,从无头单链表中删除节点void deleteRandomNode(Node *cur){ assert(cur != NULL); assert(cur->next != NULL); //不能是尾节点 Node* pNext = cur->next; cur->data = pNext->data; cur->next = pNext->next; delete pNext;} 2. 单链表的转置 题目描述: 输入一个单向链表,输出逆序反转后的链表

第六周作业

回眸只為那壹抹淺笑 提交于 2020-01-27 07:45:31
前言 这个作业属于哪个课程 C语言程序设计 这个作业的要求在哪儿 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass3-2018/homework/2891 在这个课程的目标 指针 这个作业在哪些方面帮助我 如何定义指针变量,怎样使用指针变量 参考文献 教材 C语言程序设计 6-1 求两数平方根之和 (10 分) 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double a, double b); 其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: include<stdio.h> include <math.h> double fun (double a, double b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%.2f\n", y ); return 0; } /* 请在这里填写答案 */ 输入样例: 12 20 输出样例: y=7.94 1.编程代码 double fun (double *a, double

动态规划

ε祈祈猫儿з 提交于 2020-01-27 06:40:48
动态规划 0-1背包问题 --动态规划,放入n个物体按阶段处理,第n次的结果可以基于第n-1的结果来推导. 最大重量9,物体重量分别为 3,2,4,5 int[n][w]或int[w+1]解决 0-1背包升级版: 一组不同重量、不同价值、不可分割的物品,我们选择将某些物品装入背包,在满足背包最大重量限制的前提下,背包中可装入物品的总价值最大是多少呢? 先计算单价,先放入单价高的商品 有几个节点的 i 和 cw 是完全相同的,比如 f(2,2,4) 和f(2,2,3)。在背包中物品总重量一样的情况下,f(2,2,4) 这种状态对应的物品总价值更大,我们可以舍弃 f(2,2,3) 这种状态,只需要沿着 f(2,2,4) 这条决策路线继续往下决策就可以。也就是说,对于 (i, cw) 相同的不同状态,那我们只需要保留 cv 值最大的那个,继续递归处理,其他状态不予考虑 动态规划理论 一个模型三个特征 一个模型:分阶段最优解模型 三个特征: 1)最优子结构,问题的最优解包含子问题的最优解;也可以通过子问题的最优解推导出问题的最优解 2)无后效性:在推导后面阶段的结果的时候,不关心当前结果怎么获取到的;某阶段的值确定后,就不受之后阶段的决策影响 3)重复子问题:决策序列达到相同阶段时,会产生重复的状态 解决动态规划:面对动态规划问题的时候能够有章可循,不会束手无策 注意