指针

leetcode11 盛最多的水

老子叫甜甜 提交于 2020-02-05 06:01:12
利用 双指针方法 解决本题。。(貌似还可以利用栈来解决,不过思路可能要复杂一些。) 本题抛开具体问题,想到双指针解决是降低时间复杂度的关键一步,本题如果利用暴力法解决,时间复杂度为O(n^2), 但是采用双指针法解决,时间复杂度会降低到O(n)。 时间复杂度为O(n),说明问题必须要在遍历一遍数组就解决。 从图上可直观看出,两线段之间形成的区域总是会受到其中较短那条长度的限制。此外,两线段距离越远,得到的面积就越大。 我们在由线段长度构成的数组中使用两个指针,一个放在开始,一个置于末尾。 此外,我们会使用变量 maxarea来持续存储到目前为止所获得的最大面积。 在每一步中,我们会找出指针所指向的两条线段形成的区域,更新 maxarea,并将指向较短线段的指针向较长线段那端移动一步。 class Solution { public: int maxArea(vector<int>& height) { int L = 0; int R = height.size()-1; int max_Area = 0; while(L!=R){ int temp = min(height[L],height[R])*(R-L); if(temp>max_Area) max_Area = temp; if(height[L]<height[R]){ L++; }else{ R--; } }

C++之运算符重载(二元)

本秂侑毒 提交于 2020-02-05 05:24:44
一、加号+ 1.成员函数重载 2.友元函数重载 二、输出符号<< 三、索引符号 [ ] 四、补充说明 1.《二元运算符重载》课程评论: (一)为什么<<运算符的重载必须定义为友元 如果在类中定义非友元成员函数,默认第一个参数默认会传入this*指针,这时就无法实现cout在前<<对象在后的格式 因为二元运算符中的调用格式是 参数一 运算符 参数二 这也就是为什么 加号运算符可以使用非友元成员函数,因为参数一是一个this*指针,参数二是其它对象 假设定义为非友元成员函数,那么第一个参数系统默认为this*(且无法更改),第二个参数是cout 那么调用格式就变成了 coor << cout了,这就是不能定义为非友元成员函数的原因 (二) 这里对于输出运算符重载讲得一般,当时课程上学习的时候,这里返回值为out是有原因的。 cout<<coor1<<coor2<<endl; 上面这个例子中,第一次重载<<的时候cout作为第一个参数,coor作为第二个参数,返回出来out的引用,这个out引用的是"cout<<coor1", 第二次重载的时候是将这个cout<<coor1整个作为out流对象,做成第一个参数。 2.《二元运算符重载》课程评论: 来吧!让我给您们解释一下为什么<<只能友元,而[]只能成员重载; 简而言之: <1> 对于友元重载没有this指针指向当前对象的

对指针的深入理解

烈酒焚心 提交于 2020-02-05 02:31:52
对指针的深入了解 初学者的福利来了!!!! 首先对变量这一词做一个本质的介绍。变量的实质就是一个可操作的空间,且变量的变是体现在该存储空间中所存储的地址所对应的值是可变的。比如举一个例子来说吧:现在不管打开任意一款游戏,而这款游戏中将会难免产生一些临时的数据,将会在内存中临时存储,随着游戏的不断进行,则衡量某一标准的数据随时会发生改变,因此这时随时发生变化的数据将会在内存中存储,这个时候为了确保这个可变数据所存储的地方,因此就有了变量。 【注:有些人会产生一种疑惑,问,内存不都是临时存储吗?如果这一进程结束之后,下一次进来的时候你怎么知道这个数据所存储的地址?而且这个地址并不是固定不变的,而是随机分配,你咋能确保这个地址就是呢?所以我估计对一个初学者来说会有这样的疑问吧!这个时候就会出现一个变量地址表,而是自动查找,因为这个时候你已经给了一个变量的名字了,所以就不必担心以上所出现的问题。】 指针实际上也是变量,它里面存储的实际是内存中的一个地址。打个比方吧:假如你是小明,我想找你本人的时候,这时我刚好知道你的家庭住址,那么我就可以通过你的家庭住址来找你。指针就好比小明的家庭住址,也可以说是一个间接的量吧。例如:int *p; 定义了一个指向整型的指针变量p,如果没有这个*,这就是定义了一个整型的变量,*p就是取值,把p所指向的地址空间里面的内容取出来。 例: #include

344. 反转字符串 golang

落花浮王杯 提交于 2020-02-05 01:57:41
Me 双指针操作。首指针和尾指针 func reverseString ( s [ ] byte ) { left , right : = 0 , len ( s ) - 1 for left < right && len ( s ) != 0 { s [ left ] , s [ right ] = s [ right ] , s [ left ] left ++ right -- } } 来源: CSDN 作者: 寇浩哲 链接: https://blog.csdn.net/csdn_kou/article/details/104173130

C++中引用和指针

微笑、不失礼 提交于 2020-02-05 00:51:40
C++中使用指针的优点 1.指针能够有效的表示数据结构; 2.能动态分配内存,实现内存的自由管理; 3.能较方便的使用字符串; 4.便捷高效地使用数组; 5.指针直接与数据的储存地址有关。比如:值传递不如地址传递高效, 因为值传递先从实参的地址中取出值,再赋值给形参代入函数计算;而指 针则把形参的地址直接指向实参地址,使用时直接取出数据,效率提高,特别在频繁赋值等情况下(注意:形参的改变会影响实参的值!) 引用与指针的区别 1.从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。 2.从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对象。引用不能指向空 3.从编译上看,程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。这是使用指针不安全而使用引用安全的主要原因。从某种意义上来说引用可以被认为是不能改变的指针。 4

python leetcode (18)四数之和

爷,独闯天下 提交于 2020-02-05 00:51:01
本题和三数之和那一题差不多,思想相似,三数之和的链接如下:https://blog.csdn.net/cy_believ/article/details/100067685 在三数之和的基础上,设置四个指针即可,四个指针分别如下:定点,定点1,首指针,尾指针。然后设置两层循环,i增加和j减,直到ij相等。然后定点1增加,在定点1的基础上,再初始化i,j,ij紧接着循环。定点1循环结束后,再循环最外层的定点。 class Solution : def fourSum ( self , nums , target ) : #有很多种的组合 res_nums = [ ] nums . sort ( ) print ( nums ) if len ( nums ) == 4 and nums [ 0 ] == nums [ 1 ] and nums [ 1 ] == nums [ 2 ] and nums [ 2 ] == nums [ 3 ] : if nums [ 0 ] + nums [ 1 ] + nums [ 2 ] + nums [ 3 ] == target : res_nums . append ( nums ) return res_nums else : pass for k in range ( len ( nums ) - 3 ) : # if nums[k] >

JVM 完整深入解析

末鹿安然 提交于 2020-02-04 22:17:58
工作之余,想总结一下JVM相关知识。 Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图: 1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。 2、虚拟机栈:虚拟机栈是Java执行方法的内存模型。每个方法被执行的时候,都会创建一个栈帧,把栈帧压人栈,当方法正常返回或者抛出未捕获的异常时,栈帧就会出栈。 (1)栈帧:栈帧存储方法的相关信息,包含局部变量数表、返回值、操作数栈、动态链接 a、局部变量表:包含了方法执行过程中的所有变量。局部变量数组所需要的空间在编译期间完成分配,在方法运行期间不会改变局部变量数组的大小。 b、返回值:如果有返回值的话,压入调用者栈帧中的操作数栈中,并且把PC的值指向 方法调用指令 后面的一条指令地址。 c、操作数栈:操作变量的内存模型。操作数栈的最大深度在编译的时候已经确定(写入方法区code属性的max_stacks项中)。操作数栈的的元素可以是任意Java类型,包括long和double,32位数据占用栈空间为1, 64 位数据占用2。方法刚开始执行的时候,栈是空的,当方法执行过程中

Go 系列教程 —— 第 15 部分:指针

ぃ、小莉子 提交于 2020-02-04 21:45:11
什么是指针? 指针是一种存储变量内存地址(Memory Address)的变量。 如上图所示,变量 b 的值为 156 ,而 b 的内存地址为 0x1040a124 。变量 a 存储了 b 的地址。我们就称 a 指向了 b 。 指针的声明 指针变量的类型为 *T ,该指针指向一个 T 类型的变量。 接下来我们写点代码。 package main import ( "fmt")func main() { b := 255 var a *int = &b fmt.Printf("Type of a is %T\n", a) fmt.Println("address of b is", a) } 在线运行程序 & 操作符用于获取变量的地址。上面程序的第 9 行我们把 b 的地址赋值给 *int 类型的 a 。我们称 a 指向了 b 。当我们打印 a 的值时,会打印出 b 的地址。程序将输出: Type of a is *int address of b is 0x1040a124 由于 b 可能处于内存的任何位置,你应该会得到一个不同的地址。 指针的零值(Zero Value) 指针的零值是 nil 。 package mainimport ( "fmt")func main() { a := 25 var b *int if b == nil { fmt.Println("b is",

C语言之指针理解篇----防备忘

梦想与她 提交于 2020-02-04 21:16:06
C语言之指针理解篇----防备忘 指针这个东西,ε=(´ο`*)))唉! 指针变量是占用存储空间的。 int *a;这个东西是占用内存空间的,至于占用多少,自己去用sizeof去算。 定义个指针变量之后,它必须先指向一个地址,才能往它指向的地址里放数值。 还有下面这个东西: void fun ( int * a , int * b ) { a = b ; } int main ( ) { int * a = NULL ; int b = 10 ; fun ( a , & b ) ; printf ( "%d \n" , a ) ; //输出为0,也就是仍然指向NULL } 这里我一直以为,a这个指针变量就成了b所在的地址呢,原来不是! 进入这个fun这个函数,相对于指针变量来说,仍然是【传值调用】,所以a不会变。 void fun ( int a , int b ) { a = b ; } int main ( ) { int a = 1 ; int b = 10 ; fun ( a , b ) ; printf ( "%d \n" , a ) ; //结果仍为1,不为10 } 这个两段代码,其实都是一个道理。请谨记! 来源: CSDN 作者: 秋山刀名鱼丶 链接: https://blog.csdn.net/qq_26039331/article/details

结对编程第二次作业

自古美人都是妖i 提交于 2020-02-04 20:27:49
结对编程第二次作业 小学四则运算自动生成程序 一、题目要求 本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换,这里会布置两个题目,请各组成员根据自己的爱好任选一题。 我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求: 能够自动生成四则运算练习题 可以定制题目数量 用户可以选择运算符 用户设置最大数(如十以内、百以内等) 用户选择是否有括号、是否有小数 用户选择输出方式(如输出到文件、打印机等) 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主) ---------- 点击查看他的代码: https://coding.net/u/mayingjiu123/p/zuoye/git?public=true 二、单元测试 由于本次编程结果算式皆为随机生成,故选择手动测试方式进行测试 加法小数: 随机符号小数: 随机符号括号小数: 三、代码分析表格 功能模块名称   C语言小词法识别程序 审查人   霍超然 审查日期   2017.4.4 代码名称   kaishi 代码作者   马英九 文件结构 重要性 审查项 结论 头文件和定义文件的名称是否合理? 是     头文件和定义文件的目录结构是否合理? 是   版权和版本声明是否完整? 是 重要 头文件是否使用了 ifndef/define/endif 预处理块? 是