指针

LeetCode题解 -- 双指针(633)

北战南征 提交于 2020-03-07 02:13:59
Sum of Square Numbers Given a non-negative integer c, your task is to decide whether there’re two integers a and b such that a2 + b2 = c. 相似题目:LeetCode题解 – 双指针(167) 时间复杂度:O(n) 空间复杂度:O(1) public boolean judgeSquareSum ( int c ) { int hi = ( int ) Math . sqrt ( c ) ; int lo = 0 ; while ( lo <= hi ) { int temp = lo * lo + hi * hi ; if ( temp == c ) { return true ; } else if ( temp > c ) { hi -- ; } else { lo ++ ; } } return false ; } 来源: CSDN 作者: fantow 链接: https://blog.csdn.net/fantow/article/details/104703145

第二次作业

跟風遠走 提交于 2020-03-06 20:50:12
1.看视频时存在问题 指针加减一个数代表什么 通过devc++操作明白加减的是所指向字符的字节数 mallic为什么要释放 看视频知道若不释放将会占用内存,直到指向零指针不能再分配动态内存 2.笔记 3.pta存在问题 老师的讲解已经明白具体含义 来源: https://www.cnblogs.com/syx1117/p/12430170.html

go指针接收器和非指针接收器

家住魔仙堡 提交于 2020-03-06 16:15:25
1.二者的书写方式不同 type student struct { age int8 name string } //指针接收器 func ( s * student ) ageAdd1 ( ) { s . age += 1 } //非指针接收器 func ( s student ) ageAdd2 ( ) { s . age += 1 } 2.二者传入方法中的对象不同 指针接收器传入的是struct本身,非指针接收器传入的是struct的copy副本 3.二者访问struct的级别不同 指针接收器可以读写struct中的内容,非指针接收器只能读取struct中的数据但是不能写入,如果写入的话也只是写入到struct的备份中而已。 type student struct { age int8 name string } func ( s * student ) ageAdd1 ( ) { s . age += 1 } func ( s student ) ageAdd2 ( ) { s . age += 1 } func ( s student ) ageAdd3 ( ) student { s . age += 1 return s } func main ( ) { student : = new ( student ) student . ageAdd1 ( ) fmt .

语言中结构体变量和结构体类型的定义

让人想犯罪 __ 提交于 2020-03-06 13:43:49
1. 结构体类型定义 定义方式1 : Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } *LinkList; 定义方式2 : struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } ; Typedef struct LNode *LinkList; 以上两个定义方式是等价的,是将*LinkList 定义为struct LNode 类型,即LinkList 被定义为一个类型名。这样就可以用LinkList 来定义说明新的变量了,如: LinkList L ; 即将L 定义为struct LNode 类型的指针变量 2. 结构体类型变量定义 定义方式1 : struct LNode { int data; // 数据域 struct LNode *next; // 指针域 }LnodeA ; 定义方式2 : struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } ; struct LNode LnodeA ; 以上两个定义方式也是等价的,这样就将LnodeA 定义为一个truct LNode 类型的变量,即LnodeA 为一个truct LNode 类型的变量名。

C语言之指针

社会主义新天地 提交于 2020-03-06 12:00:24
#include <stdio.h> #include <stdlib.h> void swap_t(int*a,int*b) {int p; p=*a; #借助指针,交换变量值 *a=*b; *b=p; } int main() { int a,b; a=6,b=5; #a,b的地址不变,但是经指针操作后其中的值交换 int *p,*q; #声明变量上,一般变量是被分配合法地址的,但是指针变量p是有地址的,但是p的内容可能是非法地址。 p=&a; q=&b; swap_t(p,q); #单向传递:只进不出(数值无法回传)swap函数结束后,p,q不变 printf("%d,%d",*p,*q); } 指针与数组的关系,&a[i]=(a+i),a[i]=*(a+i)#每次从a(首地址算起)即重新计算地址,p++(有规律的改变当前地址的值省去了重新计算)效率更高,但是其不够直观,数组a 不能a++的原因:a即是数组首地址是一个常量,而p对应是变量,他可以改变内部存储的地址实现p++ 区分几种形式: 0x0001 p++; //p++可以把p++看成两步,第一步返回了p的值,第二步对p自加操作有;p实现了自增 *p; //*(p+1) 0x0002 *p++ 与*(p++)//++与*同优先级,右结合性,有因为是后加加,所以第一步返回p的值,后*p,后p自增 0x0003 *(++p)

排序算法之快速排序(Quicksort)解析

旧街凉风 提交于 2020-03-06 11:47:29
一.快速排序算法的优点,为什么称之为快排? Quicksort是对归并排序算法的优化,继承了归并排序的优点,同样应用了分治思想。 所谓的分治思想就是对一个问题“分而治之”,用分治思想来解决问题需要两个步骤: 1.如何“分”?(如何缩小问题的规模) 2.如何“治”?(如何解决子问题) 快排的前身是归并,而正是因为归并存在不可忽视的缺点,才产生了快排。归并的最大问题是需要额外的存储空间,并且由于合并过程不确定,致使每个元素在序列中的最终位置上不可预知的。针对这一点,快速排序提出了新的思路:把更多的时间用在“分”上,而把较少的时间用在“治”上。从而解决了额外存储空间的问题,并提升了算法效率。 快排之所以被称为“快”排,是因为它在平均时间上说最快的,主要原因是硬件方面的,每趟快排需要指定一个“支点”(也就是作为分界点的值),一趟中涉及的所有比较都是与这个“支点”来进行比较的,那么我们可以把这个“支点”放在寄存器里,如此这般,效率自然大大提高。除此之外,快排的高效率与分治思想也是分不开的。 二.算法思想 按照快排的思想,对一已知序列排序有如下步骤: 1.指定“支点” 注意,是“指定”,并没有明确的约束条件,也就是说这个支点是任意一个元素,一般我们选择两种支点:当前序列首元,或者随机选取 两种方式各有优劣,前者胜在简单,但可能影响算法效率 快排中,支点的最终位置越靠近中间位置效率越高

《C++ Primer(第五版)》第六章笔记

旧城冷巷雨未停 提交于 2020-03-06 08:53:59
6.1 函数基础   通过 调用运算符 来执行函数。函数的调用完成两项工作:用实参初始化函数的形参;将控制权转移给被调用函数。   当遇到一条 return 语句时函数结束执行过程。return 也完成两项工作:返回 return 语句中的值;将控制权从被调用函数转移回主调函数。 形参和实参   形参出现在函数定义的地方,实参出现在函数调用的地方。实参是形参的初始值,实参的类型必须与对应的形参类型相匹配。   任意两个形参都不能同名,而且函数最外层作用域中的局部变量也不能使用与函数形参一样的名字(外层局部变量被内部形参隐藏)。 6.1.1 局部对象   对象的 生命周期 是程序执行过程中该对象存在的一段时间。   形参和函数体内部定义的变量统称为 局部变量 。局部变量会 隐藏 在外层作用域中同名的其他所有声明中。   只存在于块执行期间的对象称为 自动对象 。    局部静态对象 在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁。内置类型的未初始化局部变量产生未定义的值,内置类型的局部静态变量初始化(值初始化)为 0。 6.2 参数传递   形参的类型决定了形参和实参交互的方式。当形参是引用类型时,其对应的实参被 引用传递 或函数被 传引用调用 ;当实参的值被拷贝给形参时,实参被 值传递 或函数被 传值调用 。 6.2.1 传值参数  

快慢指针

℡╲_俬逩灬. 提交于 2020-03-06 06:03:22
快慢指针 快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。 例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。 快慢指针的应用 (1)判断单链表是否存在环 如果链表存在环,就好像操场的跑道是一个环形一样。此时让快慢指针都从链表头开始遍历,快指针每次向前移动两个位置,慢指针每次向前移动一个位置;如果快指针到达NULL,说明链表以NULL为结尾,没有环。如果快指针追上慢指针,则表示有环。代码如下: bool HasCircle(Node *head) { if(head == NULL) return false; Node *slow = head, *fast = head; while(fast != NULL && fast->next!=NULL) { slow = slow->next; //慢指针每次前进一步 fast = fast->next->next;//快指针每次前进两步 if(slow == fast) //相遇,存在环 return true; } return false; } (2)在有序链表中寻找中位数 快指针的移动速度是慢指针移动速度的2倍,因此当快指针到达链表尾时,慢指针到达中点。 程序还要考虑链表结点个数的奇偶数因素,当快指针移动x次后到达表尾(1+2x),说明链表有奇数个结点,直接返回慢指针指向的数据即可。

总结自己的Git常用命令

走远了吗. 提交于 2020-03-06 02:25:46
总结自己的Git常用命令 使用git也有一段时间了,把自己常用的命令用自己的描述记录起来,方便自己备忘也方便其他人参考。 目录: 最基本的命令 : git clone 拷贝并跟踪远程的master分支。跟踪的好处是以后可以直接通过pull和push命令来提交或者获取远程最新的代码,而不需要指定远程分支名字。 git submodule init git submodule update 参考示意图 HEAD 指向当前的commit 对象(可以想象为当前分支的别名),同时也用来表明我们在哪个branch上工作。所以当我们使用HEAD来操作指针的时候,其实就是不改变当前的commit的指向。 对照这张图来理解两段提交,工作区(working tree),暂存区(index)和 branch之间的关系 显示信息类命令 git ls-files -u 显示冲突的文件,-s是显示标记为冲突已解决的文件 git diff 对比工作区和stage文件的差异 git diff --cached 对比stage和branch之间的差异 git branch 列出当前repository下的所有branch git branch --a 列出local 和remote下的所有branch git ls-files --stage 检查保存在stage的文件 git log

3.5 模拟面试

情到浓时终转凉″ 提交于 2020-03-06 01:03:19
1.如何判断链表为环 答:有两种方法    1,快慢指针:一个一步走,一个两步走,如果快指针遇到NULL代表无环,快慢相遇代表有环   2,哈希:用哈希记录之前的节点,然后判断当前节点是否在之前出现过 2.蓄水池抽样原理  答:不会,明天补上>_< 3..C中static的作用? 答:1,隐藏:如果全局变量定义的话,作用域是所有源文件,但是如果static修饰后,作用域就是在当前源文件中使用    2,局部持久化:如果在函数里面定义使用的话,能保持之前的值 4.满二叉树是什么,如何在二叉排序树中找到第三大节点 答:就是除了叶子节点,每个节点都有左右孩子 使用中序遍历能够从小到大的遍历二叉排序树 5.extern关键字用法 答:多个源文件做到一次定义,多次申明 extern "C" 代表接下来的代码使用C环境编译 6.stl vector push_back() 的复杂度?扩容机制?为什么要 2 倍扩容? 答:均摊复杂度是O(1) ,vector底层有三个指针,代表开始 ,结尾 ,容量结尾,如果到达容量,那么就需要扩容,一般是1.5倍或者2倍,2倍原因的话做不到均摊O(1) (不懂为啥2倍就做不到。明天看下   拓展:1.5倍比2倍好在哪里,因为如果2倍扩容的话,考虑连续申请的内存空间 1 2 4 8 16 32,因为申请内存在删除内存之前,所以当前内存得不到复用,只能依靠之前的内存