指针

每天AC系列(一):三数之和

本秂侑毒 提交于 2020-01-24 00:28:10
1 题目 LeetCode第15题 ,难度中等,题目描述: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 2 解法 什么也不管先来个O(n3): for(int i=0;i<nums.length;++i) { for(int j=i+1;j<nums.length;++j) { for(int k=j+1;k<nums.length;++k) { if(nums[i]+nums[j]+nums[k] == 0) { ArrayList<Integer> arrayList = new ArrayList<>(); arrayList.add(nums[i]); arrayList.add(nums[j]); arrayList.add(nums[k]); result.add(arrayList); } } } } well. 3 优化 上面暴力算法的思想就是单纯三个循环,优化的方法可以考虑降低一个循环,使用"双指针"的思想,首先对数组进行排序,然后一开始固定一个数,然后让两个指针一个指向这个数的右区间的起点,一个指向终点,不断计算这三个值的和,根据得出的和移动左指针或者右指针,一共三种情况: 和等于0,同时移动左右指针

数组指针,指针数组,数组名,指针变量名作函数的参数

允我心安 提交于 2020-01-23 19:27:47
想当年学得比较晕的部分,近日整理了下 #include <stdio.h> /*指针的基本概念,理解,应用,强制类型转换 初始化有三种方式: int a,b = 1000,*pointer_a = &a,*pointer_b; 声明的同时初始化,也可先声明再初始化 *pointer_b = &b;pointer_b = pointer_a; 赋值,b指向a指的内存,要求两者数据类型一致 所有指针类型,均占四个字节的存储空间,类型不同的指针变量之间不能直接赋值,可以通过强制类型转换 void类型是万能类型,无需任何转换,可与其他类型相互赋值 例如:pointer_a = (int*)1245056 1245056是变量a的地址 */ //实例1 #if(0) #include <stdio.h> int main(){ int a = 1000,*pointer_a = &a; char ch,*point_ch; point_ch = &ch; ch = 'A'; *point_ch = 'B'; pointer_a = (int*)1245056; //把数值强制转换为指针类型,不可直接赋值 pointer_a = 1245054 printf("&a = %d,&ch = %d,pointer_a = %d\n",&a,&ch,pointer_a); printf("ch =

名字与地址转换(摘抄自网络)

▼魔方 西西 提交于 2020-01-23 18:23:23
一、gethostbyname()函数说明——用域名或主机名获取IP地址 包含头文件 #include <netdb.h> #include <sys/socket.h> 函数原型 struct hostent *gethostbyname(const char *name); 这个函数的传入值是域名或者主机名,例如"www.google.cn"等等。传出值,是一个hostent的结构。如果函数调用失败,将返回NULL。 返回hostent结构体类型指针 hostent->h_name 表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com。 hostent->h_aliases 表示的是主机的别名.www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。 hostent->h_addrtype 表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是pv6(AF_INET6) hostent->h_length 表示的是主机ip地址的长度 hostent->h_addr_lisst 表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话

RT-Thread中的链表结构

与世无争的帅哥 提交于 2020-01-23 16:46:35
文章目录 RT-Thread中的链表组织结构 RT-Thread中的链表操作 链表节点的插入 链表节点的删除 链表节点元素访问 RT-Thread中的链表组织结构   RT-Thread中的链表是带表头节点的双向循环链表结构,它的表头节点与之前的博客《 双向循环链表 》中介绍的表头节点不同,之前博客介绍的表头节点与后继节点结构是一致的,这是因为指针类型问题,前面介绍过的链表都是前驱节点指向后继节点的首地址,即指向节点结构体的指针。RT-Thread链表节点中的指针并不是指向节点首地址(这种说法并不严谨,尽管实际上它确实不是指向节点首地址),而是指向节点中的list结构体元素,这种链表结构让链表更加灵活。 /** * Double List structure */ struct rt_list_node { struct rt_list_node * next ; /**< point to next node. */ struct rt_list_node * prev ; /**< point to prev node. */ } ; typedef struct rt_list_node rt_list_t ; /**< Type for lists. */   RT-Thread中的链表指针定义为 rt_list_t ,而不是节点类型,这就可以使链表的操作(例如:插入、删除

链表中环的入口结点

断了今生、忘了曾经 提交于 2020-01-23 14:03:26
题目:链表中环的入口结点 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路: 入环前路程为a,入环点到相遇点距离b,相遇点到入环点距离c。一个快指针fast,每次走2步,一个慢指针,每次走1步; 快指针路程=a+(b+c)k+b ,k>=1 其中b+c为环的长度,k为绕环的圈数(k>=1,即最少一圈,不能是0圈,不然和慢指针走的一样长,矛盾)。 慢指针路程=a+b 快指针走的路程是慢指针的两倍,所以: (a+b)*2=a+(b+c)k+b 化简可得: a=(k-1)(b+c)+c 这个式子的意思是: 链表头到环入口的距离=相遇点到环入口的距离+(k-1)圈环长度 。其中k>=1,所以 k-1>=0 圈。所以两个指针分别从链表头和相遇点出发,最后一定相遇于环入口。 #include<iostream> #include<vector> #include<stack> using namespace std; struct ListNode{ int val; ListNode *next; ListNode(int x): val(x),next(NULL){} }; class Solution { public: ListNode* EntryNodeOfLoop(ListNode* pHead) { ListNode *fast

Remove Duplicates from Sorted List

£可爱£侵袭症+ 提交于 2020-01-23 13:24:27
Given a sorted linked list, delete all duplicates such that each element appear only once . For example, Given 1->1->2 , return 1->2 . Given 1->1->2->3->3 , return 1->2->3 . 分析:这道题很简单,循环遍历每个结点,当遇到相同的结点,则该链表结点的next就指向该链表结点next的next,否则,继续探测该节点的next结点。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *deleteDuplicates(ListNode *head) { if(head==NULL) return NULL; ListNode* pList=head; while(pList->next) { if(pList->val==pList->next->val) { pList->next=pList->next->next; }

GO语言-指针

霸气de小男生 提交于 2020-01-23 13:13:59
一、Go语言中的指针 任何程序数据载入内存后,在内存都有他们的地址,这就是指针。而为了保存一个数据在内存中的地址,我们就需要指针变量。 比如,“永远不要高估自己”这句话是我的座右铭,我想把它写入程序中,程序一启动这句话是要加载到内存(假设内存地址0x123456),我在程序中把这段话赋值给变量 A ,把内存地址赋值给变量 B 。这时候变量 B 就是一个指针变量。通过变量 A 和变量 B 都能找到我的座右铭。 Go语言中的指针不能进行偏移和运算,因此Go语言中的指针操作非常简单,我们只需要记住两个符号: & (取地址)和 * (根据地址取值)。 1.1 指针地址和指针类型 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用 & 字符放在变量前面对变量进行“取地址”操作。 Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如: *int 、 *int64 、 *string 等。 取变量指针的语法如下: ptr := &v // v的类型为T 其中: v:代表被取地址的变量,类型为 T ptr:用于接收地址的变量,ptr的类型就为 *T ,称做T的指针类型。*代表指针。 举个例子: func main() { a := 10 b := &a fmt.Printf("a:%d ptr:%p\n", a

138. Copy List with Random Pointerv

删除回忆录丶 提交于 2020-01-23 05:49:38
138. 复制带随机指针的链表 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的 深拷贝 。 示例: 输入: {"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1} 解释: 节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。 节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。 提示: 你必须返回 给定头的拷贝 作为对克隆列表的引用。 解法一: //时间复杂度O(n), 空间复杂度O(n) /* // Definition for a Node. class Node { public: int val; Node* next; Node* random; Node() {} Node(int _val, Node* _next, Node* _random) { val = _val; next = _next; random = _random; } }; */ class Solution { public: Node* copyRandomList(Node* head) { if(!head) return nullptr; if

第六周编程总结

a 夏天 提交于 2020-01-23 05:12:54
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 *b) { double y; y=sqrt(*a)+sqrt(*b); return y; } 2)设计思路 3)本次调试过程中遇到的问题 问题:主要是输出重复以及返回错误。把printf语句删除,把return 0改为return y. 4)运行结果截图 7-1 利用指针返回多个函数值 (30 分) 读入n个整数,调用max_min(

C++编程实现变长数组

ⅰ亾dé卋堺 提交于 2020-01-23 05:00:56
1.变长一维数组 这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做: //文件名: array01.cpp #include<iostream> using namespace std; int main() { int len; cin>>len; //用指针p指向new动态分配的长度为len*sizeof(int)的内存空间 int *p=new int[len]; ........... delete[] p; return 0; } 注意int *p=new int[len];这一句,你不能这样做: int p[len]; C++编译器会报错说len的大小不能确定,因为用这种形式声明数组,数组的大小需要在编译时确定。而且这样也不行: int p[]=new int[len]; 编译器会说不能把int*型转化为int[]型,因为用new开辟了一段内存空间后会返回这段内存的首地址,所以要把这个地址赋给一个指针,所以要用int *p=new int[len]; array01.cpp实现了一个变长的一维数组,但是要养成一个好习惯,就是注意要注销指针p,使程序释放用new开辟的内存空间。 当然使用C++标准模版库(STL)中的vector(向量)也可以实现变长数组: //文件名: array02