指针

面试题 23:链表中环的入口节点

最后都变了- 提交于 2020-03-18 23:58:28
3 月,跳不动了?>>> 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路 书中解法 查询是否有环,设定两个指针,第一个慢指针每次走一步,第二个快指针每次走两步。当快指针超过慢指针时,即链表中有环。 查询环中的节点数,可从 1 中获得在环中的某个节点,通过这个节点循环遍历,可以回到此节点,由此计算节点数 nodesInLoop。 从链表头开始,设定两个指针,第一个指针先走环中节点数 nodesInLoop 次数,然后第二个指针与第一个指针开始同时遍历,每次走一步,到两指针相会时,所指向的节点即为入口节点。 其他解法 双指针法 https://leetcode-cn.com/problems/linked-list-cycle-ii/ 代码 书中解法 public class Solution { public ListNode detectCycle(ListNode head) { ListNode meetingNode = meetingNode(head); // 链表中无环,直接返回 null if (meetingNode == null) { return null; } // 得到环中节点的数目 int nodesInLoop = 1; ListNode pNode1 = meetingNode; while (pNode1

洛谷 P3808 【模板】AC自动机(简单版) 题解

狂风中的少年 提交于 2020-03-18 17:40:07
原题链接 前置知识: 字典树。(会 \(\texttt{KMP}\) 就更好) 显然呢,本题用 字典树 和 \(\texttt{KMP}\) 无法解决问题。 所以我们发明了一个东西: \(\texttt{AC}\) 自动机! 自动AC就算了吧 首先,我们给这些串建字典树。 建完之后,我们求 失配指针 。 这是干嘛的?求完再说。 它表示以 \(i\) 节点为 结尾 的串的 后缀 有最大公共长度的 前缀 的 结尾 编号. 可能有点绕,但是字符串匹配算法,一开始就是雾里云里,后来就是拨云见雾。 引用一张洛谷题解上的图吧。 然后,比方说第 \(3\) 层的 \(c\) . 首先,以它结尾的后缀有: \(\texttt{c}\) , \(\texttt{bc}\) , \(\texttt{abc}\) . 显然,从根开始的前缀(不含根)找不到 \(\texttt{abc}\) . 但是,我们找到了 \(\texttt{bc}\) . 所以,就指向了 \(\texttt{bc}\) 中的 结尾 编号的 \(c\) 的位置。 余下同理,读者自行推理。 下面,我们假设这个图的只有每个叶子节点都是一个单词的末尾。那么,假设我们要找在 \(\texttt{abcde}\) 中的次数,一开始 \(ans = 0\) .流程为: 首先一路往下,到 \(d\) 之后发现 \(e\) 没了。这时 \(ans

1161 字符串长度(指针专题)

爱⌒轻易说出口 提交于 2020-03-18 15:15:25
题目来源: https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1161 Description 编写一函数len,求一个字符串的长度,注意该长度不计空格。要求用字符指针实现。在主函数中输入字符串,调用该len函数后输出其长度。 int len(char *sp) { //实现sp所指串的长度,不计空格。 } Input 输入一个字符串,以回车结束,长度不超过100。 Output 输出一个整数,单独占一行。 Sample Input What day is today? Sample Output 15 题意描述: 输入一个字符串(长度不超过100) 调用len函数计算该字符串的长度,不计空格 解题思路: 在len函数中判断是否空格,不是计数变量加一,最后返回即可 程序代码: 1 #include<stdio.h> 2 #include<string.h> 3 int len(char *str); 4 int main() 5 { 6 char str[110]; 7 gets(str); 8 printf("%d\n",len(str)); 9 } 10 int len(char *str) 11 { 12 int i,l,count=0;//注意计数变量的初始化 13 l=strlen(str); 14 for(i=0;i<l

2019 第六周作业

不想你离开。 提交于 2020-03-18 14:41:17
2019春季第六周作业 这个作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 ( https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2888 ) 我在这个课程的目标是 理解变量、内存单元和地址之间的关系,掌握指针变量的基本运算 这个作业在哪个具体方面帮助我实现目标 这个作业让我大概了解了指针的定义及用法 参考文献 ( https://jingyan.baidu.com/article/20095761754006cb0721b4bb.html ) 一、基础题 1、求两数平方根之和 函数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

sqlite索引的原理

喜你入骨 提交于 2020-03-18 13:59:12
引言 这篇文章 ,里面讲到对于一个41G大小、包含百万条记录的数据库进行查询操作,如果利用了索引,可以把操作耗时从37s降到0.2s。 那么什么是索引呢?利用索引可以加快数据库查询操作的原理是什么呢? 索引的基本原理 数据库提供了一种持久化的数据存储方式,从数据库中查询数据库是一个基本的操作,查询操作的效率是很重要的。 对于查询操作来说,如果被查询的数据已某种方式组织起来,那么查询操作的效率会极大提高。 在数据库中,一条记录会有很多列。如果把这些记录按照列Col1以某种数据结构组织起来,那么列Col2一定是乱序的。 因此,数据库在原始数据之外,维护了满足特定查找算法的数据结构,指向原始数据,称之为 索引 。 举例来说,在下面的图中,数据库有两列Col1、Col2。在存储时,按照列Col1组织各行,比如Col1已二叉树方式组织。如果查找col1中的某一个值,利用二叉树进行二分查找,不需要遍历整个数据库。 这样一来列Col2就是乱序的。为了解决这个问题,为Col2建立了索引,即把Col2也按照某种数据结构(这里是二叉树)组织起来。这样子查找列Col2时只需要进行二分查找即可。  索引的实现 由于数据库是存储在磁盘上的,因此实现索引用的数据结构会存储在磁盘上。磁盘的IO是需要注意的问题。 二叉树 二叉树是一种经典的数据结构,但是并不适合进行数据库索引。

【Leetcode 做题学算法周刊】第四期

流过昼夜 提交于 2020-03-18 13:32:44
首发于微信公众号《前端成长记》,写于 2019.11.21 背景 本文记录刷题过程中的整个思考过程,以供参考。主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 67.二进制求和 69.x的平方根 70.爬楼梯 83.删除排序链表中的重复元素 88.合并两个有序数组 Easy 67.二进制求和 题目地址 题目描述 给定两个二进制字符串,返回他们的和(用二进制表示)。 输入为非空字符串且只包含数字 1 和 0 。 示例: 输入: a = "11", b = "1" 输出: "100" 输入: a = "1010", b = "1011" 输出: "10101" 题目分析设想 这道题又是一道加法题,所以记住下,直接转数字进行加法可能会溢出,所以不可取。所以我们需要遍历每一位来做解答。我这有两个大方向:补0后遍历,和不补0遍历。但是基本的依据都是本位相加,逢2进1即可,类似手写10进制加法。 补0后遍历,可以采用先算出的位数推入数组最后反转,也可以采用先算出的位数填到对应位置后直接输出 不补0遍历,根据短数组的长度进行遍历,长数组剩下的数字与短数组生成的进位进行计算 查阅他人解法 Ⅰ.补0后遍历,先算先推 代码: /** * @param {string} a * @param {string} b * @return {string} */ var

python文件操作

余生长醉 提交于 2020-03-18 08:19:01
1、读取文件并将文件存在字典中 # 文件读取方式操作 accounts_file = 'F:\\Myself\\xxx\\xxx\\xxx\\user.txt' #文件路径 account_list = open(accounts_file) #打开文件 user_list={}#创建一个空字典 #将文件一行行读取,并保存到字典中 for user in account_list.readlines(): user =user.strip() if len(user)==0: continue else: user_list[user.split(',')[0]] = user.split(',')[1] #为字典的key赋值value account_list.close() 在读取路径时,比如c:\\niu\\desktop 这种,open在打开文件时会把c:\\niu 认为里面有一个\n,所以我们可以在文件路径前加一个r,比如f=open(r'c:\\niu\\desktop\haha') 表示原字符,不需要转义。 print(f.readline()) #读取一行数据 print(f.readlines())#获取文件里面所有的数据,每一行数据放到一个list里面 print(f.read()) #获取全部文件内容 依次执行上面三种函数,读取时,readline读取第一行

Python3中IO文件操作的常见用法

自古美人都是妖i 提交于 2020-03-18 08:18:24
首先创建一个文件操作对象: f = open(file, mode, encoding) file指定文件的路径,可以是绝对路径,也可以是相对路径 文件的常见mode: mode = “r” # 只读 mode = “w” # 只写 mode = “a” # 追加 mode = “r+” #可以读写 正常情况最常用的方式就是r+,通过设置光标的方式进行读写! 详细的mode: Mode Annotations r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 r+ 打开一个文件用于读写。文件指针将会放在文件的开头。 rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后

unix文件操作函数

拈花ヽ惹草 提交于 2020-03-18 08:16:17
1. fopen函数 1 #include <stdio.h> 2 FILE *fopen(const char *path, const char *mode) 返回:文件顺利打开后,指向该流的文件就会被返回。如何文件打开失败则返回NULL,并把错误代码存在 errno 中。 参数说明:   mode: 1)r 以只读方式打开文件,该文件必须存在。      2) r+ 以可读写方式打开文件,该文件必须存在。      3) rb+ 以读写打开一个二进制文件,允许读写数据,文件必须存在。      4) rw+ 打开一个文本文件,允许读和写。 5) w 打开只写文件,若文件存在则文件长度清为0,即该文件内容消失,若文件不存在则创建该文件。      6) w+ 打开可读写文件,若文件存在则文件长度清为0,即文件文件内容会消失。若文件不存在则创建文件文件。       7) a 以附加的方式打开只写文件,若文件不存在,则会创建文件文件,如果文件存在,则写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)       8) a+ 以附加的方式打开可读写文件。若文件不存在,则会创建该文件,如果文件存在,则写入的数据 会被添加到文件尾,即文件碑的内容会被保留。(原来的EOF符不保留) 9) wb 只写打开或新建 一个二进制文件。只允许写数据。 10)wb+

Facebook 如何管理150亿张照片

非 Y 不嫁゛ 提交于 2020-03-17 15:20:07
某厂面试归来,发现自己落伍了!>>> Facebook 的照片分享很受欢迎,迄今,Facebook 用户已经上传了150亿张照片,加上缩略图,总容量超过1.5PB,而每周新增的照片为2亿2000万张,约25TB,高峰期,Facebook 每秒处理55万张照片,这些数字让如何管理这些数据成为一个巨大的挑战。本文由 Facebook 工程师撰写,讲述了他们是如何管理这些照片的。 旧的 NFS 照片架构 老的照片系统架构分以下几个层: # 上传层接收用户上传的照片并保存在 NFS 存储层。 # 照片服务层接收 HTTP 请求并从 NFS 存储层输出照片。 # NFS存储层建立在商业存储系统之上。 因为每张照片都以文件形式单独存储,这样庞大的照片量导致非常庞大的元数据规模,超过了 NFS 存储层的缓存上限,导致每次招聘请求会上传都包含多次I/O操作。庞大的元数据成为整个照片架构的瓶颈。这就是为什么 Facebook 主要依赖 CDN 的原因。为了解决这些问题,他们做了两项优化: # Cachr: 一个缓存服务器,缓存 Facebook 的小尺寸用户资料照片。 # NFS文件句柄缓存:部署在照片输出层,以降低 NFS 存储层的元数据开销。 新的 Haystack 照片架构 新的照片架构将输出层和存储层合并为一个物理层,建立在一个基于 HTTP 的照片服务器上,照片存储在一个叫做