指针

C博客作业--指针

自古美人都是妖i 提交于 2020-01-31 00:21:49
一、PTA实验作业 题目1:6-2 求出数组中最大数和次最大数 1. 本题PTA提交列表 2. 设计思路 定义函数int fun ( int *a, int n ) 定义变量i,j表示下标,iindex=0表示最大值下标,max表示最大值,t表示交换中介 for i=0 to 1 for j=i to n-1 max←下标为index的数组元素*(a+index) 寻找数组中从下标为 j 开始的最大值 IF max<*(a+j) index←j 把最大值的下标赋给index 交换a[i]和a[index] end for 返回*a 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明。 开始时认为只是类似于冒泡排序于是把所有数组元素进行了排序,发现c++上答案和pta不一样后发现只需要做冒泡排序的前两次即可 题目2:6-3 统计大于等于平均分人数 1. 本题PTA提交列表 2. 设计思路 定义函数int fun ( float *s, int n, float *aver ) 定义整型变量i,浮点型变量sum=0表示成绩之和,result表示大于等于平均分的同学个数 for i=0 to n-1 将所有输入的成绩求和 end for 计算平均分 *aver=sum/n for i=0 to n-1 IF(输入的数组元素*(s+i)大于等于平均分*aver) result+

C博客作业--指针

浪子不回头ぞ 提交于 2020-01-31 00:14:29
一、PTA实验作业 题目1:字符串串动变化 1. 本题PTA提交列表 2. 设计思路 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明 一开始写成了这样 小细节导致错误,认真读了一遍代码后解决 题目2:求子串在母串中最后一次出现的地址 1.本题PTA提交列表 2. 设计思路 int i,k=0,flag=0,count=0,count判断是否有子串,flag记录子串出现的下标 for i=0 to s[i]!='\0' k=0 for j=o to t[k]!='\0' 如果s[j]!=t[k] 不为子串的话 break k++ 如果t[k]=='\0'即为子串的话 flag=i 记下下标 count=1 存在子串 如果count!=0 存在子串 t=&s[flag] t为子串在母串中最后一次出现的地址 return t 否则 return 0 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明 虽说我的代码一遍就过了,但是我觉得代码是错误的,只是题目没有考察到这个点 一开始的代码: 如果s的第一个字符开始就出现子串,还是会返回0. 改正方法:引入count查看是否存在子串 题目3:使用函数实现字符串部分复制 1.本题PTA提交列表 2.设计思路 int i,k=0 for i=m-1 to t[i]!='\0'从题目给定位置开始遍历 s[k]=t[i]

双指针,BFS与图论(一)

﹥>﹥吖頭↗ 提交于 2020-01-30 20:21:49
(一)双指针 1.日志统计 小明维护着一个 程序员 论坛。现在他收集了一份”点赞”日志,日志共有 N 行。 其中每一行的格式是: ts id 表示在 t s 时刻编号 i d 的帖子收到一个”赞”。 现在小明想统计有哪些帖子曾经是”热帖”。 如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K 个赞,小明就认为这个帖子曾是”热帖”。 具体来说,如果存在某个时刻 T 满足该帖在 [ T , T + D ) 这段时间内(注意是左闭右开区间)收到不少于 K 个赞,该帖就曾是”热帖”。 给定日志,请你帮助小明统计出所有曾是”热帖”的帖子编号。 输入格式 第一行包含三个整数 N , D , K 以下 N 行每行一条日志,包含两个整数 t s 和 i d 。 输出格式 按从小到大的顺序输出热帖 i d 。 每个 i d 占一行。 数据范围 1 ≤ K ≤ N ≤ 10 5 , 0 ≤ t s , i d ≤ 10 5 , 1 ≤ D ≤ 10000 输入样例: 7 10 2 0 1 0 10 10 10 10 1 9 1 100 3 100 3 输出样例: 1 3 解题思路:排序+双指针 ①对所有的赞按时间排序 ②通过双指针i,j维护长度不大于d的区间,并记录该帖子中的获赞数 #include<iostream> #include <algorithm> #include

心跳与超时:高并发高性能的时间轮超时器

試著忘記壹切 提交于 2020-01-30 19:59:12
心跳与超时:高并发高性能的时间轮超时器 文章目录 心跳与超时:高并发高性能的时间轮超时器 引言 JDK 原生提供的超时任务支持 java.util.Timer ScheduledThreadPoolExecutor 更高效的数据结构 基本原理 支撑更多超过范围的延迟时间 方案一:不同轮次的延迟任务共存相同的延迟队列 方案二:多层次时间轮 Netty 的时间轮实现 接口定义 构建循环数组 新增延迟任务 工作线程workerThread 线程启动与准备工作 驱动指针和任务触发 时间轮停止 思考总结 引言 在许多业务场景中,我们都会碰到延迟任务,定时任务这种需求。特别的,在网络连接的场景中,常常会出现一些超时控制。由于服务端的连接数量很大,这些超时任务的数量往往也是很庞大的。实现对大量任务的超时管理并不是一个容易的事情。 本章我们将介绍几种用于实现超时任务的数据结构,并且最后分析 Netty 在超时任务上采取的结构和代码。 欢迎加入技术交流群186233599讨论交流,也欢迎关注笔者公众号:风火说。 JDK 原生提供的超时任务支持 java.util.Timer JDK 在 1.3 的时候引入了 Timer 数据结构用于实现定时任务。 Timer 的实现思路比较简单,其内部有两个主要属性: TaskQueue :定时任务抽象类 TimeTask 的列表。 TimerThread

15. 三数之和(leetcode)

南笙酒味 提交于 2020-01-30 13:41:15
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 我一拿到这题,就想着暴力破解,三重循环,i<j<k,这样也不用担心遍历重复了,但是这题还要考虑,给定的数组 nums 里元素重复。 答案思路:双指针法,用双重循环,其中一层循环双指针,一个循环两个变量,时间复杂度就减少了。   第一层固定元素k,第二层循环指针 i,j   k<i<j 收获:   1.本题学到了双指针法,一个指向头,一个指向尾,A情况头指针++,B情况尾指针--,C情况 头指针++ 尾指针--;   2.学会了遍历List时候 去重的程序写法,看起来很舒服。     i += 1     while i < j and nums[i] == nums[i-1]: i += 1     注: 是 i == i-1 不是 i == i+1 : 因为是判断现在与过去,不是现在与将来。 class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: if len(nums) < 3: return None nums.sort() res = [] k = 0 while k < len(nums): if nums[k] > 0 :

结构体中定义函数指针

做~自己de王妃 提交于 2020-01-30 11:10:10
结构体指针变量的定义 定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct 结构体标识符 {   成员变量列表;… }; struct 结构体标识符 *指针变量名; 变量初始化:struct 结构体标识符 变量名={初始化值1,初始化值2,…,初始化值n }; 形式2:在定义类型的同时定义变量 struct 结构体标识符 {   成员变量列表;… } *指针变量名; 形式3:直接定义变量,用无名结构体直接定义变量只能一次 struct {   成员变量列表;… }*指针变量名; 其中“指针变量名”为结构体指针变量的名称。形式1是先定义结构体,然后再定义此类型的结构体指针变量;形式2和形式3是在定义结构体的同时定义此类型的结构体指针变量。 函数指针的定义 一般的函数指针可以这么定义:    int (*func)(int,int); 表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数: int add2(int x,int y) {   return x+y; } 那么在实际使用指针func时可以这样实现: func=&add2; //指针赋值,或者func=add2; add2与&add2意义相同 printf("func(3,4)=%d\n",func(3,4)); 事实上,为了代码的移植考虑

结构体变量 和 结构体指针

独自空忆成欢 提交于 2020-01-30 10:24:57
为什么结构体在声明变量不需要去动态的分配内存,而声明结构体指针后,如果对成员进行操作需要分配内存,或者需要定义。 首先变量的声明与定义: extern int i; //声明,不是定义 int i; //声明,也是定义 编译器会随机分配一个定义给i,这个地址肯定是合法的。 然后指针变量的声明与初始化: int *i; //声明一个指针变量 *i = 3; //直接将值赋值给i所指向的地址。因为我们未对i进行初始化,所以我们也不知道i到底指向哪。有一点可以肯定的是这个地址不会是存储变量的内存空间,有兴趣的可以将这个值打印出来分析。(有关内核空间的内存有机会总结一篇) 现在回到结构体,直接看下图 我们会发现结构体指针变量的地址为0,这显然不是一个合法的地址,所以后面的赋值操作就会发生段错误。 所以必须对指针初始化,所谓的初始化就是让指针指向一个合法有效的内存空间,而分配空间的方法有两种:静态分配,动态分配。下面的是静态的,动态的就是malloc()函数 这个就可以正常的赋值。 来源: https://www.cnblogs.com/hgstudy/p/9610985.html

结构体指针连接

淺唱寂寞╮ 提交于 2020-01-30 10:23:41
版本一: #include <stdio.h> #include <stdlib.h> #include <memory.h> /*使用编译器默认对齐方式*/ typedef struct tagInfo { int iNum; char szName[10]; int iAge; }stINFO; stINFO gstMessage[] = { {10, "liming", 100}, {20, "zhangsan", 200}, {30, "jack", 300} }; stINFO gstSubMessage[] = { {50, "plato", 550}, {55, "socrates", 800} }; int main() { int iNum = 0; int i = 0; stINFO *pAll = NULL; int iSubNum = 0; iSubNum = sizeof(gstSubMessage) / sizeof(stINFO); iNum = sizeof(gstMessage) / sizeof(stINFO); pAll = (stINFO *)malloc((iNum + iSubNum) * sizeof(stINFO)); if (pAll == NULL) { printf("alloc memory failed!/n");

单链表的反转 - 三指针版

て烟熏妆下的殇ゞ 提交于 2020-01-30 07:59:34
当创建一个链表后,链表只知道自己的下一个节点,而不知道自己的上一个节点,为了能够让节点知道上一个节点,我们需要这样做。 1、创建三个指针 一个是沿着原来的链表进行遍历,一个存储,一个用于交换 2、进行将链表反向的工作 比如: 原来链表 0 -> 1 -> 2 -> 3 -> 4…-> n ->NULL; 用代码来表示就是 0.next = 1 1.next = 2 2.next = 3 3.next = 4 等等 我们需要变成的是 n -> n-1 -> … -> 4 -> 3 -> 2 -> 1 -> 0 -> NULL 用代码来表示就是 n.next = n-1 4.next = 3 3.next = 2 2.next = 1 1.next = 0 0.next = NULL 下面这块代码的三个指针 current : 遍历指针 temp : 用于存储的指针 point : 指向需要交换的值 比如第一轮while是这样的 *刚开始 current = 0 temp = NULL point = NULL (我们想要的效果是 0.next = NULL) 所以最终想要得到的表达式是 current.next = point 但是为了进行下一轮的循环 可以用temp来代替current 让 current继续迭代 就是 temp.next = point public void

C中数组与指针及多维数组

社会主义新天地 提交于 2020-01-30 04:36:40
2011年4月9日17:42:57 C中的字符串数组与字符串指针的区别 从上面的截图,我们可以看到字符数组和字符串的差别。他们的类型是不同的,比如上面的代码中,filename的类型是char[12],而pname的类型是char*,&filename的结果是数组指针,图中显示的是char[12]*。还可以发现,对于pname和p虽然是两个不同的指针,但是他们都指向同一个地址,这也是编译器投机取巧的地方,因为他们都是指向"fangzhen"这个字符串,所以编译器就只存储一次。 还有&"fangzhen"的用法也是可以的。 2011年4月10日11:24:40 c中多维数组的内存分配过程 第一种方法: arr值为0x002efaae8, 指向int**所在的位置,即*arr所在的位置 *arr值为0x003C4F78, 这是指向的rows个int*所在的内存位置 可以看到绿框后面还有8个初始化化为0的字节, 其实后面是(*arr)[1]和(*arr[2])的地址, 共rows(3)个int*的地址,即共3个int** 第一个int*所在的位置为0x003c1290, 没有进行初始化 第二个int*所在位置为0x003c12e0(从下图我们可以读出) 具体分配的内存为: 在内存1中查看 在内存2中查看 第3个int*所在位置为0x003c1580(从下图的蓝色框内可以看出)