指针

lintcode5 - Kth Largest Element - medium

*爱你&永不变心* 提交于 2020-01-19 10:13:58
基础知识补充 if: 就是一个判断的,如果满足后面的条件就继续运行if语句里面的东西的,要是不满足就跳出来,执行else语句或执行下面的语句的 。 while: 就是循环语句的,当满足while里面的条件时,就会执行里面的循环体的,直到条件不满足为止。 左右都取等号 避免 极端情况 Find K-th largest element in an array. Example In array [9,3,2,4,8], the 3rd largest element is 4. In array [1,2,3,4,5], the 1st largest element is 5, 2nd largest element is 4, 3rd largest element is 3 and etc. Challenge O(n) time, O(1) extra memory. Notice You can swap elements in the array Quick select. O(n)。一轮O(n)操作后把原问题化解为规模仅一半的问题(只接着搜其中一半了) 实现:指针+递归。指针分为双指针和三指针两种写法,递归分为改变k和不改变k的写法。 三指针:中间扫描,大扔左,小扔右,最后l左边的肯定全大的,r右边肯定全小的,lr加上中间的是==的。具体非对称写法还是“从左开始扫

剑指offer 链表中环的入口结点

£可爱£侵袭症+ 提交于 2020-01-19 05:09:07
题目 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 由定理得知:一个慢指针(每次走一步),一个快指针(每次走两步),如果该链表有环的情况下则慢指针和快指针会最终在环中相遇。 该定理可以通过数学归纳法证明: 慢指针和快指针之间相差的步数为1的时候,两个指针相差一步,如 此时继续往后走,慢指针前进一步,快指针前进两步,两者相遇。 慢指针和快指针之间相差的步数为2的时候,两个指针相差两步, 此时继续往后走,慢指针前进一步,快指针前进两步,两者之间相差一步,转化为第一种情况 慢指针和快指针之间相差的步数n步时,两个指针相差n步,继续往后走,慢指针前进一步,快指针前进两步,两者之间相差N-1步。因此返回慢指针和快指针之间相差的步数为n-1的情况。 以此类推最终慢指针会和快指针相遇。 假设两指针在5节点相遇 设1节点到4节点距离为x,4到5为y,5到4为z。 慢指针行走距离为s,快指针为f,由题意2×s=f。 s=x-1+n(z+y)+y, f=x-2+N(z+y)+y。已知当fast指针比slow指针走多一圈时相遇,所以N=n+1; n为slow在环里走的圈数,N为fast在环里走的圈数。所以综上所有条件得出x=z; 所以令p指针和slow指针再走x距离,便是环的入口。 public class Solution { public ListNode

指针学习四——指针、数组、地址

佐手、 提交于 2020-01-19 04:39:46
指针、数组、地址 指针是以地址作为值的变量,数组名的值是一个特殊的固定地址,看作是指针常量。 int a[100] , *p; 系统把编号为3000,30002...的内存字节作为数组元素a[0],a[1]...的地址。 基地址:内存位置3000是数组a的基地址,即a[0]的地址。 地址常量:数组名a是一个地址常量。 p=a; p=&a[0]; 语句等价,都把3000这个地址值赋给了指针p。 p=a+1; p=&a[1]; 同样,也是等价的,都把3002这个地址值赋给了指针p。 指针 内存地址 内存单元 数组元素 p 3000 a[0] p+1 3002 a[1] p+2 3004 a[2] 数组元素求和: 法一: sum=0; for(p=a;p<=&[99];p++) sum+=*p; *(a+i)与a[i]等价——地址+1为下一个地址,实际增加的不为一。 法二: sum=0; for(p=a;p<=&[99];p++) sum+=*(a+1); 法三: p=a; sum=0; for(i=0;i<100;++i) sum+=p[i]; 1.数组a是指针常量,不是变量。a++是非法的。 2.变量p是指向某个指定类型的指针,p+1代表访问的是下一个变量的内存地址。p+i是有意义的。 3.若p和q都是指向数组的指针,p-q产生一个int型的值,表示之间的数组元素的个数。 4

部分错题记录

人走茶凉 提交于 2020-01-19 01:41:06
1.下面不能正确进行字符串赋值操作的是( )。 A: char s[6]={“ABCDE”}; B: char s[5]={‘A’,'B’,'C’,'D’,'E’}; C: char *s;s=”ABCDE”; D: char *s; scanf(“%s”,s); 标准答案:B 您的答案:C B选项应该为char s[6]={‘A’,'B’,'C’,‘D’,‘E’,’\0’}; 2.在c语言中,不允许有常量的数据类型是( ) (2分) A.整型 B.结构型 C.字符型 D.字符串 标准答案:B 您的答案:D 结构是用户自己建立的数据类型,没有常量 3.在C语言中,数字029是一个() A: 八进制数 B: 十六进制数 C: 十进制数 D: 非法数 标准答案:D 您的答案:C 八进制数以0开头,八进制数不能大于7 十六进制以ox开头,十六进制的数不能大于15,且10 ~ 15的数用A~ F或a~f来表示 4.以下程序有错,错误原因是___________。 main ( ) { int * p , i ; char * q , ch ; p = & i ; q = & ch ; * p = 40 ; p = q ; ┆ } A:p和q的类型不一致,不能执行p=q;语句 B: p中存放的是地址值,因此不能执行 p=40;语句 C: q没有指向具体的存储单元,所以*q没有实际意义 D:

自用笔记12——指针/数组初始化

ⅰ亾dé卋堺 提交于 2020-01-19 01:36:03
int maxNumberOfBalloons ( char * text ) { int i = 0 , j = 0 , t = 0 , len = 0 , num = 0 ; int * count = malloc ( sizeof ( int ) * 5 ) ; count [ 0 ] = 0 , count [ 1 ] = 0 , count [ 2 ] = 0 , count [ 3 ] = 0 , count [ 4 ] = 0 ; len = strlen ( text ) ; for ( i = 0 ; i < len ; i ++ ) { if ( text [ i ] == 'b' ) count [ 0 ] ++ ; else if ( text [ i ] == 'a' ) count [ 1 ] ++ ; else if ( text [ i ] == 'n' ) count [ 2 ] ++ ; else if ( text [ i ] == 'l' ) count [ 3 ] ++ ; else if ( text [ i ] == 'o' ) count [ 4 ] ++ ; } if ( count [ 3 ] > count [ 4 ] ) j = ( int ) count [ 4 ] / 2 ; else j = ( int ) count

golang之不安全编程

无人久伴 提交于 2020-01-19 00:38:16
楔子 不安全编程?用golang以来也没发现有啥不安全的啊,而且golang有垃圾回收,也不需要我们来管理内存。当听到不安全编程这几个字,唯一能想到的也就是指针了,只有指针才可能导致不安全问题。我们知道golang中是有指针的,但是golang的指针并不能像C语言中的指针一样,可以进行运算,所以golang中的指针既提供了指针的便利性,又保证了安全。但是在golang中,可以通过一个叫做 unsafe 的包让指针突破限制,从而进行运算,一旦用不好会导致很严重的问题,但是用好了在某些场景下能够带来很大的便利,所以我们说这是不安全编程。但即便如此,我们还是可以使用的,而且golang的内部也在大量的使用unsafe这个包。 golang中的指针 尽管golang的指针没有C的指针那么强大,但是能够获取一个变量的地址,并且能通过地址来改变存储的值,我个人认为已经足够了。 package main import "fmt" func pass_by_value(num int){ num = 3 } func pass_by_pointer(num *int){ *num = 3 num = nil } func main() { num := 1 pass_by_value(num) fmt.Println("传递值:", num) //传递值: 1 pass_by_pointer(

数据结构-链表的基本操作

我的梦境 提交于 2020-01-19 00:27:40
数据结构-链表(C语言) 四种常见的链表结构 结点包括两个域,存储数据信息的是数据域,存储直接后继或前驱存储位置的域的是指针域。指针域中存储的信息称为指针。单链表的指针域只有一个Next指向直接后继而双向链表的指针域有两个Next和Prev分别指向直接后继和直接前驱结点。 使用链表的好处:便于插入和删除,时间复杂度都为O(1)。 下面是关于单链表的创建,插入,删除,查询和遍历的代码 结点的定义 typedef struct LNode { int data ; struct LNode * next ; } Node , * LinkList ; 其中data为数据域,next为指针域 链表的创建 LinkList create_list ( ) { LinkList head , p , q ; int i = 0 ; head = NULL ; p = ( LinkList ) malloc ( sizeof ( Node ) ) ; scanf ( "%d" , & p -> data ) ; while ( p -> data ) { if ( i == 0 ) { head = p ; p -> next = NULL ; q = p ; i ++ ; } else { p -> next = NULL ; q -> next = p ; q = p ; } p = (

C语言函数返回指针方法

那年仲夏 提交于 2020-01-19 00:10:27
什么是指针? 指针 是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。 指针变量声明 type *var-name; type 是指针的基类型,它必须是一个有效的 C 数据类型, var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。 空指针 赋为 NULL 值的指针被称为 空 指针,NULL 指针是一个定义在标准库中的值为零的常量。 数组指针: 它是一个指针,它指向一个数组。指向数组的指针,本质是指针。 int (*p)[3] 因为()优先级高,首先说明p是一个指针,指向一个int型的一维数组, 数组有3个元素,每个元素是一个int型整数 简单来说,就是int (*p)[3]是指一个指向数组的指针,它其实还是一个指针,只不过是指向数组而已 指针数组: 它是一个数组,数组的元素都是指针。存放指针的数组,本质是数组。 int *p[3] [ ] 优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,指针数组本身就是个数组,只不过这个数组里存放的不是int 不是char,而是一个指针类型( int*,char* ),也就是就是地址 。 函数返回指针 C语言允许函数的返回值是一个 指针 (地址),我们将这样的函数称为指针函数。 用指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量

c语言指针

故事扮演 提交于 2020-01-19 00:01:07
。mage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTc0NDk4Ng==,size_16,color_FFFFFF,t_70) 二,指针变量 怎样引用指针变量 在引用指针变量的时候有三种情况: 1:给指针变量赋值 如:p=&a; //把a的地址赋给指针变量p ,指针变量p的值是a的地址,p指向a。 2:引用指针变量指向的变量。 如果已执行“p=&a;”,即指针变脸p指向了整型变量a,则printf("%d",*p); 其作用是以整型形式输出指针变量p所指向的变量的值,即变量a的值。 如果有以下赋值语句: *p=1; 表示将整数1赋值给p当前所指向的变量,如果p指向a,则相当于把1赋值给a,即“a=1” 引用指针变量的值。如: printf(“%o”,p); 作用是以八进制数形式输出指针变量p的值,如果p指向了a,就是输出了a的地址,即&a。 *指针运算符(或称“间接访问”运算符),*p代表指针变量p所指的对象 #include <stdio.h> int main() { int *p1, *p2, *p, a, b; //p1,p2的类型是int *类型 printf("please enter two integer numbers:"