指针

常见排序算法-----快速排序

*爱你&永不变心* 提交于 2020-03-07 11:08:20
最好时间复杂度O(nlogn) 最坏时间复杂度O(N^2) 方法一: 左右指针法: 1 /** 2 * 双指针法,将基准点设置为最左端 3 * 4 * @param arr 5 * @param left 6 * @param right 7 */ 8 public static void quicklySort(int[] arr, int left, int right) { 9 10 if (left >= right) { 11 return; 12 } 13 14 int base = arr[left]; 15 int i = left; 16 int j = right; 17 while (i < j) { 18 while (j > i && arr[j] >= base) { 19 j--; 20 } 21 while (j > i && arr[i] <= base) { 22 i++; 23 } 24 if (i < j) { 25 int temp = arr[i]; 26 arr[i] = arr[j]; 27 arr[j] = temp; 28 } 29 } 30 arr[left] = arr[i]; 31 arr[i] = base; 32 quicklySort(arr, left, i - 1); 33 quicklySort(arr, i +

C/C++学习笔记——C基础:指针

对着背影说爱祢 提交于 2020-03-07 11:00:59
概述 内存 内存含义: 存储器:计算机的组成中,用来存储程序和数据,辅助CPU进行运算处理的重要部分。 内存:内部存贮器,暂存程序/数据——掉电丢失 SRAM、DRAM、DDR、DDR2、DDR3。 外存:外部存储器,长时间保存程序/数据—掉电不丢ROM、ERRROM、FLASH(NAND、NOR)、硬盘、光盘。 内存是沟通CPU与硬盘的桥梁: 暂存放CPU中的运算数据 暂存与硬盘等外部存储器交换的数据 物理存储器和存储地址空间 有关内存的两个概念:物理存储器和存储地址空间。 物理存储器:实际存在的具体存储器芯片。 主板上装插的内存条 显示卡上的显示RAM芯片 各种适配卡上的RAM芯片和ROM芯片 存储地址空间:对存储器编码的范围。我们在软件上常说的内存是指这一层含义。 编码:对每个物理存储单元(一个字节)分配一个号码 寻址:可以根据分配的号码找到相应的存储单元,完成数据的读写 内存地址 将内存抽象成一个很大的一维字符数组。 编码就是对内存的每一个字节分配一个32位或64位的编号(与32位或者64位处理器相关)。 这个内存编号我们称之为内存地址。 内存中的每一个数据都会分配相应的地址: char:占一个字节分配一个地址 int: 占四个字节分配四个地址 float、struct、函数、数组等 指针和指针变量 内存区的每一个字节都有一个编号,这就是“地址”。

830. Positions of Large Groups

孤街醉人 提交于 2020-03-07 08:17:23
解题思路:因为给定的string已经按序排列,所以这是一个典型的双指针滑动窗口的问题。 设置两个指针。 一个指向开始位置(start),另外一个指针不断的向后滑动 如果滑动指针指向的值与start指针指向的值相同,则继续向后滑动 如果滑动指针指向的值与start指针指向的值不同,则判断group长度 如果满足“large”的定义,则加入到返回值中 否则更新start指针值,继续以上步骤 时间复杂度O(n), 空间复杂度O(1). class Solution { public: vector<vector<int>> largeGroupPositions(string S) { vector<vector<int>> res; for(int i = 0; i < S.size(); ++i){ int start = i; while(S[i] == S[i + 1]){ ++i; } if((i - start) >= 2){ res.push_back({start, i}); } } return res; } }; 来源: https://www.cnblogs.com/wdw828/p/11363192.html

c/c++ 函数指针的用法

戏子无情 提交于 2020-03-07 07:02:16
【目录】 基本定义 c 函数指针使用举例 c++ 函数指针使用举例 函数指针作为函数参数 函数指针作为函数返回值 函数指针数组 typedef 简化函数指针操作 c语言函数指针的定义形式: 返回类型 (* 函数指针名称 )( 参数类型 , 参数类型 , 参数类型, …); c++函数指针的定义形式 : 返回类型 (类名称 ::* 函数成员名称)(参数类型,参数类型,参数类型, ….); 以下代码编译环境:codeblocks with gcc in win 7 c语言函数指针使用举例: #include <stdio.h> #include <stdlib.h> int fun1() { printf("this is fun1 call\n"); return 1; } void fun2(int k, char c) { printf("this is fun2 call:%d %c\n", k, c); } int main() { int (*pfun1)() = NULL; void (*pfun2)(int, char) = NULL; int a,b; pfun1 = fun1; //第一种赋值方法 a = pfun1(); //第一种调用方法(推荐) printf("%d\n",a); b = (*pfun1)();//第二种调用方法 printf("%d\n",b

Delphi 记录类型- 结构指针

醉酒当歌 提交于 2020-03-07 06:11:47
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} type TRec = record {定义结构 TRec} name: string[12]; age: Word; end; TPRec = ^TRec; {定义 TRec 结构的指针类型 TPRec} var Rec: TRec; {声明结构变量} PRec1,PRec2: TPRec; {声明 TPRec 指针变量}

数据结构之链表与数组(三)-单向链表上的简单操作

北战南征 提交于 2020-03-07 06:07:18
4 反转单向链表(非递归实现) 思路: 图1 非递归反转链表 如图1所示,假设已经反转了前面的若干节点,且前一段链表的头节点指针为pre,则现在要做的事情是首先保存当前节点cur后面的链表,然后让当前节点cur的指针与后面的节点断开(step1),接下来再将当前节点的next指针指向前一段链表的头节点pre (step2)。处理完当前节点的连接反转后,所有的指针都向后移一位。开始处理下一个节点。 注意点: 1,反转后原来的头节点就变成了反转链表的尾节点,要注意将此结点next指针设为空,否则可能会产生死循环等问题 2,要记得处理链表中没有节点或只有一个的情况。 代码实现: //反转链表(非递归的方式) //输入参数:单链表的头指针 //输出参数:无 //返回值:反转后的单链表指针 SingleList* Reverse_NRecu(SingleList *head) { SingleList *pre,*cur,*lat; //链表中没有节点或只有一个节点 if((head == NULL)||(head->next == NULL)) { return head; } pre = head; cur = head->next; head->next = NULL;//在链表中应该注意边界情况的处理,尾结点一定要为空 lat = cur->next; while(lat !=

数组与指针

北城余情 提交于 2020-03-07 04:39:43
#include<stdio.h> #include<stdlib.h> //struct Test //{ // int Num; // char pcName; // short sDate; // char cha[2]; // short sBa[4]; //}; //此结构体占内存为20个字节 int main() { //问题1 //&a得到是一个int( )[5],指针数组 //&a+1得到的是5后边的那个元素 //所以ptr指向的是5后边的那个元素 //但是ptr被强转为int* //所以指针-1向前跳过一个元素指向的是5这个元素的地址 //在对其*得到5这个元素 // (a+1)可以看成a[1] // 即打印出的就是 2 5 //int a[5] = { 1,2,3,4,5 }; //int ptr = (int )(&a + 1); //printf("%d%d\n", (a + 1), (ptr - 1)); //问题2 // struct Test p=(struct Test )0x100000; //给P赋值为0x100000 //%p为打印地址 //因为p占内存为20 //所以输出0x100020 // printf("%p\n",p+0x1); //下面的强制类型转换.导致p就变成了一个unsigned long 类型的,在去+1,就只是简单的整数

C++虚函数实现

若如初见. 提交于 2020-03-07 03:08:51
虚函数出现的原因 C++多态通过虚函数来实现,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖,或者称为重写。 最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,动态绑定。由于编写代码时不能确定被调用的是基类还是哪个派生类的函数,所以被称为“虚函数”。如果没有使用虚函数的话,即没有利用C++的多态性,则利用基类指针调用相应的函数时,总被限制在基类函数本身,而无法调用到子类中被重写过的函数。 # include <iostream> using namespace std ; class A { public : void foo ( ) { printf ( "A::foo()1\n" ) ; } virtual void fun ( ) { printf ( "A::fun 2\n" ) ; } } ; class B : public A { public : void foo ( ) //隐藏:派生类的函数屏蔽了与其同名的基类函数 { printf ( "B::foo3\n" ) ; } void fun ( ) //多态、覆盖 { printf ( "B::fun4\n" ) ; } } ; int main ( void ) { A a ; B b ; A * p = & a ; p - > foo ( ) ; //输出1

C++ STL之vector用法总结

北战南征 提交于 2020-03-07 02:54:34
来源:https://www.cnblogs.com/zhonghuasong/p/5975979.html 介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。 vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。 与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效

基础IO(文件操作)

一曲冷凌霜 提交于 2020-03-07 02:26:59
文章目录 文件操作 系统调用的文件操作 文件描述符 文件流指针与文件描述符的关系 重定向 动态库和静态库 文件操作 FILE * fopen ( const char * path , const char * mode ) ; FILE:返回值是文件流指针类型 path:需要打开文件的路径,可以是绝对路径,也可以是相对路径(相对与当前目录的路径) mode: r: 以读方式打开,如果当前文件不存在,则会报错 r+: 以读写方式打开,如果当前打开文件不存在,则报错 w: 以写方式打开,如果文件不存在,则在当前目录下创建该文件;如果当前文件存在,则将当前文件截断(清空) w+: 以读写方式打开,其他和w形式相同 a: 以追加方式打开(文件流指针指向当前文件的尾部,不能读),如果文件不存在则创建 a+: 以追加方式打开,如果文件不存在则创建,支持可读可写 size_t fread ( void * ptr , size_t size , size_t nmemb , FILE * stream ) ; ptr: 将fread读到的内容保存在ptr下 size: 块的大小 nmemb: 需要读的块的个数 size* nmemb == 总的字节数量 stream: 文件流指针,从哪里读 返回值: 返回成功读取到的块的个数 用法: 将块的大小指定为1(1个字节)