指针

Leetcode 5 15 98 138解题记录

点点圈 提交于 2019-12-22 11:43:16
文章目录 15 3Sum 98 验证二叉搜索树 5 最长回文子串 138 拷贝带有随机指针的链表 刷top-100的题目,最近做了这四道,原题: 138 , 5 , 15 , 98 . 15 3Sum 给你一串整数,让你找里面所有和为0的三元组。 思路 : 暴力的话三循环,时间复杂度高。可以考虑先求任意两个数的和 a ,然后找剩下的数中值为 -a 的元素,但是复杂度依旧很高。考虑先确定一个数 b ,那么接下来的任务就是找和为 -b 的两个数,这个任务可以通过双指针法实现 - 排序然后从头部和尾部向中间靠拢。举个例子 设数组 a[9]={-5 0 1 1 2 3 3 4 4} ,求 1 ~ 9 中和为 5 的二元组: 双指针 i=1, j=8 ,结果集 res 若 a[i]+a[j] == t ,则将这个二元组放入 res ,并将 i++, j++ 若 a[i]+a[j] < t ,则 i++ 若 a[i]+a[j] > t ,则 j++ 重复上述操作直到 i>=j 上述过程会产生重复的元组 (1,4) ,产生的原因是相同的元素多次计算了,那只需在每次执行 i++ 或 j++ 时,跳过相同的元素即可。 代码: vector < vector < int >> threeSum ( vector < int > & nums ) { if ( nums . size ( ) < 3 )

typedef和#define的用法与区别

左心房为你撑大大i 提交于 2019-12-22 11:33:46
typedef和#define的用法与区别 一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。 二、#define的用法 #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编 译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,它的实例像: #define INT int #define TRUE 1 #define Add(a,b) ((a)+(b)); #define Loop_10 for (int i=0; i<10; i++) 在Scott Meyer的Effective C++一书的条款1中有关于#define语句弊端的分析,以及好的替代方法,大家可参看。 三、typedef与#define的区别 从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而

C++设计模式5--单例模式Singleton--当前对象只有一个实例 .

你离开我真会死。 提交于 2019-12-22 07:08:41
很多情况下,我们在开发项目的过程中,都希望自己运行的某个部件只有一个实例, 比如我们天天用QT开发界面,QTCreate里帮助菜单下的关于Qt Create菜单,弹出来的关于对话框,在QTCreate运行过程中,不论单击多少次,弹出的总是同一个对话框,这里的关于对话框就是一个单例模式实现的对象。 再比如说我们经常用的Windows下的任务管理器,无论打开多少次,同时同一个任务管理器对话框。 单例模式概述 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。 在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:保证一个类只有一个实例,并提供一个访问它的全局访问点。首先,需要保证一个类只有一个实例;在类中,要构造一个实例,就必须调用类的构造函数,如此,为了防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为protected或private;最后,需要提供要给全局访问点,就需要在类中定义一个static函数,返回在类内部唯一构造的实例。 实现要点 单例模式的要点有三个; ①是某个类只能有一个实例; ②是它必须自行创建这个实例;

线性表之链表实现:单向链表、循环链表、双向链表

余生长醉 提交于 2019-12-22 05:34:31
线性表 单向链表实现: 优点:便于插入和删除 缺点:查找数据需要遍历 声明 一个数据+一个指针 typedef struct LNode *List; struct LNode { int Data; List next; }; 求表长 遍历表,当指向节点的指针为NULL时停止 int Length(List PtrL) { List p = PtrL; int j = 0; while (p) { p = p->next; j++; } return j; } 查找数据 当指针不为NULL或者未找到数据时,继续循环 按值查找 List Find(int X, List PtrL) { List p = PtrL; while (p!=NULL && p->Data != X)p = p->next; return p; } 按序号查找 List FindKth(int K, List PtrL) { List p = PtrL; int i = 1; while (p != NULL&&i < K) { p = p->next; i++; } if (i == K)return p; else return NULL; } 插入数据 当插在第一个位置时:创建节点,让该节点直接指向头结点。 当插在第i个位置时:创建节点,让该节点指向该位置的后一个节点

java实现单链表常见操作

こ雲淡風輕ζ 提交于 2019-12-22 05:33:37
一、概述:    本文主要总结单链表常见操作的实现,包括链表结点添加、删除;链表正向遍历和反向遍历、链表排序、判断链表是否有环、是否相交、获取某一结点等。 二、概念: 链表:    一种重要的数据结构,HashMap等集合的底层结构都是链表结构。链表以结点作为存储单元,这些存储单元可以是不连续的。每个结点由两部分组成:存储的数值+前序结点和后序结点的指针。即有前序结点的指针又有后序结点的指针的链表称为双向链表,只包含后续指针的链表为单链表,本文总结的均为单链表的操作。 单链表结构: Java中单链表采用Node实体类类标识,其中data为存储的数据,next为下一个节点的指针: package com.algorithm.link; /** * 链表结点的实体类 * @author bjh * */ public class Node { Node next = null;//下一个结点 int data;//结点数据 public Node(int data){ this.data = data; } } 三、链表常见操作: package com.algorithm.link; import java.util.Hashtable; /** * 单链表常见算法 * @author bjh * */ public class MyLinkedList { /**链表的头结点*/

数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现

不打扰是莪最后的温柔 提交于 2019-12-22 05:32:25
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 数据结构图文解析之:树的简介及二叉排序树C++模板实现. 数据结构图文解析之:AVL树详解及C++模板实现 数据结构图文解析之:二叉堆详解及C++模板实现 1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的 有限序列 。线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱,序列尾元素没有直接后继。 数据结构中常见的线性结构有数组、单链表、双链表、循环链表等。线性表中的元素为某种 相同 的抽象数据类型。可以是C语言的内置类型或结构体,也可以是C++自定义类型。 2. 数组 数组在实际的物理内存上也是连续存储的,数组有上界和下界。C语言中定义一个数组: 数组下标是从0开始的,a[0]对应第一个元素。其中,a[0]称为数组a的下界,a[6]称为数组a的上届。超过这个范围的下标使用数组,将造成 数组越界错误 。 数组的特点是: 数据连续,支持快速随机访问。 数组分为固定数组与动态数组。其中固定数组的大小必须在编译时就能够确认,动态数组允许在运行时申请数组内存。复杂点的数组是多维数组

【C++】---指针和引用的区别

旧城冷巷雨未停 提交于 2019-12-22 05:27:06
【C++】—指针和引用的区别 两者本质 :引用是别名,指针是地址、实体 两者区别 : 1.初始化要求不同:引用在创建的同时必须初始化,即引用到一个有效的对象,而 指针在定义的时候不必初始化 ,可以在定义后面的任何地方重新赋值。 2.可修改性性不同:引用一旦被初始化为指向一个对象,它就 不能被改变为另一个对象的引用 ;而指针在任何地方都可以改变为指向另一个对象。给引用赋值并不是改变它和原始对象的绑定关系。 3.不存在NULL引用,引用不能使用指向空值的引用,它必须总是指向某个对象;而指针则可以是NULL,而不需要总是指向某些对象,可以把指针指向任意的对象,所以 指针更加灵活,但是也更容易出错 。 4.测试需要的区别:由于引用不会指向空值,这意味着使用引用前不需要测试它的合法性,而指针则需要经常进行测试。因此使用引用的代码效率比使用指针的效率要高。 5.应用的区别:如果是指一旦指向一个对象后就不会改变指向,那么应该使用引用。如果有存在指向NULL(不指向任何对象)或在不同的时刻指向不同的对象这些可能性,应该使用指针更为稳妥一些。 6.运算符的区别:指针和引用的自增(++)运算意义不用,引用自加即引用的实体增加1,指针自加即指针向后 偏移一个类型的大小 。 7.计算对象大象大小:"sizeof 引用"得到的是所指向的变量(对象)的大小,而"sizeof 指针"得到的是指针本身的大小。 8

编程注意事项及技巧

好久不见. 提交于 2019-12-22 05:26:14
编程习惯 每写一段程序就测试程序是否正确。总之就是写一段验证一段 做除法运算时,一定要检测分母为零的情况 尽量多使用小于符号 便于程序理解和程序的规范(比如二分查找) 编程技巧 如果数字大的离谱,说明有技巧或者规律 循环时使用位运算可以大大提高速度 除法用辗转相除法 指针: p+i a+i &a[i] 等价 (p+i) (a+i) a[i] 等价 p[i] (p+i) 等价 a[i] [j] , * (*(p+i)+j) 等价于 p [i] [j] char *p p="hello" (当赋值后,值不能再被修改。但是可以对 p 重新赋值) &a 相当于管辖范围上升了一级 *a 相当于管辖范围下降了一级 int sum(int a[]) 将形参数组名作为指针变量来处理 const int *p 当 p 被赋值后 p 所指向的值不能再被修改,但是 p 可以被重新赋值 int *function(int sum) 返回指针的函数。必须确保返回的地址有意义,返回全局变量的地址,不是非全局变量,返回静态局部变量,而非动态 C语言中每一个函数都有地址 算数组个数: sizeof(a)/sizeof(a[0]) 定义结构体的时候,里面的变量可以不能初始化。因为定义结构体时,并未给其分配内存,所以初值是无法存储的 打表,就是把各个情况的答案列举出来,然后对应输出来 注意

python文件的写入和读取

旧城冷巷雨未停 提交于 2019-12-22 05:03:19
1、txt,xls,doc等文件的使用 f=open(“filename”,”w”) 打开一个用于写入的文件,要写入内容时使用f.write(“内容”) f=open(“filename”,”r”) 打开一个用于读的文件,读时使用f.read(),返回读取的到的字符串; f=open(“filename”,”a”) 打开的文件既可用于读,也可用于写; 注:以上方式打开的文件读取出来的内容是字符串,写入的时候也必须全都是字符串; 2、pickle模块 pickle提供了从python程序中保存数据最简单的方法,原理是直接将数据以二进制进行保存,可以将数据原封不动的保存和读取;但如果加载不可信源有安全危险; 以gzip压缩的文件都以一个特定的魔数引导。 f=open(filename,"wb") #读取用"rb",追加用"ab",还有"rb+","wb+","ab+"表示可读可写; pickle.dump(data,fh,pickle.HIGHEST_PROTOCOL)#pickle文件的写入方法 读取可用pickle.load(fh) 3、文件对象属性与方法 1 f.close() 关闭文件对象f,并将属性f.close设置为True; 2 f.close 文件已关闭,则返回True; 3 f.encoding byte与str之间进行转换时使用的编码; 4 f.fileno()

C语言博客作业05-指针

百般思念 提交于 2019-12-22 03:26:45
1.本章学习总结  1.1思维导图  1.2本章学习体会及代码量  1.2.1学习体会  1.2.2代码量 2.PTA总分  2.1截图PTA中函数题目集的排名得分  2.2我的总分 3.PTA实验作业  3.1PTA题目1 判断回文字符  3.1.1算法分析 bool palindrome 定义 数组长度 立count 头和尾用指针循环判断 如果头指针 的值等于尾指针的值则 count++ 计数 最后 判断count是否与数组长度相等 是则 返回 true  3.1.2代码截图  3.1.3PTA提交列表及说明 4.大作业 来源: https://www.cnblogs.com/zrjAIRON/p/10128660.html