指针数组

LeetCode 26-删除排序数组中的重复项

二次信任 提交于 2020-01-24 03:10:53
1. 删除排序数组中的重复项 public class RemoveDuplicates26 { /**删除排序数组中的重复项 时间复杂度:O(n) i和j最多都走n步 * 例:nums = [1,1,2], 返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 * @param nums 待排序数组 * @return 数组中不重复元素个数 */ /*方法:双指针法 * 1.开始时这两个指针都指向第一个数字 * 2.如果两个指针指的数字相同,则快指针向前走一步 * 3.如果不同,则两个指针都向前走一步 * 4.当快指针走完整个数组后,慢指针当前的坐标加1就是数组中不同数字的个数 */ public int removeDuplicates(int[] nums) { //数组为空 if (nums.length == 0) return 0; //数组不为空 int i = 0; for (int j = 1; j < nums.length; j++) { if (nums[j] != nums[i]) { i++; nums[i] = nums[j]; } } return i + 1; } } 2.双指针法原理图 3.leetCode代码测试 来源: CSDN 作者: 徒伤 链接: https://blog.csdn.net/weixin

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

允我心安 提交于 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 =

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

C陷阱与缺陷--读书笔记3 语义“陷阱”

北城余情 提交于 2020-01-23 01:51:14
第三章 一、知识点 1、C语言中的数组值得注意的地方有以下两点:(P41) (1)、C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外打的一个数组。 (2)、对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他有关数组的操作,哪怕它们乍看上去十一数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。 2、对于int calendar[12][31]; 这个语句生命了calendar是一个数组,该数组拥有12个数组类型的元素,其中每个元素都是一个拥有31个整型元素的数组。(P42) 3、如果两个指针指向的是同一个数组中的元素,我们可以把这两个指针相减。(P43) 4、*(a+i)即数组中下标为i的元素的引用。由于a+i与i+a的含义一样,因此a[i]与i[a]也具有同样的含义。(P44) 5、来看几个声明:(P45) int calendar[12][31]; int *p; int i; calendar[4]是calendar数组的第5个元素,是calendar数组中12个有着31个整型元素的数组之一。可以有 p = calendar[4];

C基础第29课--指针和数组分析(下)

帅比萌擦擦* 提交于 2020-01-22 04:58:56
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。 实验1 :数组的访问方式 #include <stdio.h> int main() { int a[5] = {0}; int* p = a; int i = 0; for(i=0; i<5; i++) { p[i] = i + 1; } for(i=0; i<5; i++) { printf("a[%d] = %d\n", i, *(a + i)); } printf("\n"); for(i=0; i<5; i++) { i[a] = i + 10; } for(i=0; i<5; i++) { printf("p[%d] = %d\n", i, p[i]); } return 0; } mhr@ubuntu:~/work/C$ gcc 29-1.c mhr@ubuntu:~/work/C$ mhr@ubuntu:~/work/C$ ./a.out a[0] = 1 a[1] = 2 a[2] = 3 a[3] = 4 a[4] = 5 p[0] = 10 p[1] = 11 p[2] = 12 p[3] = 13 p[4] = 14 mhr@ubuntu:~/work/C$ 实验2 :数组与指针的不同 ext.c int a[] = {1, 2, 3, 4, 5}; 29-2.c

C语言博客作业—字符数组

[亡魂溺海] 提交于 2020-01-22 02:55:06
一、PTA实验作业 题目1:字符串转换成十进制整数 1. 本题PTA提交列表 2. 设计思路 (1)定义i为循环变量,number用于存放每一次转化的结果,flag用于判断是否为负数,p用于修改结果的正负; (2)定义字符型数组hexad,并输入字符串; (3)for( from i=0 to hexad[i]!='#' ) //遍历数组 if(hexad[i]为'-'且flag为零0) //说明还没有遇到第一个十六进制字符 则结果为负数; if(hexad[i]在'0'到'9'之间) //挑出十六进制字符,转成相应的十进制 number=number*16+hexad[i]-48,flag=1; else if(hexad[i]在'A'到'F'之间) number=number*16+hexad[i]-55,flag=1; else if(hexad[i]在'a'到'f'之间); number=number*16+hexad[i]-87,flag=1; end (4)输出结果 3.代码截图。 4.本题调试过程碰到问题及PTA提交列表情况说明。 一开始的思路是不太理解符号的判断规则所以想用另一个字符数组存放筛选过的字符串,然后再进行转换;但是没有办法判断好符号,所以去看了一下别的代码是怎么判断这个地方的,然后就引用了一个p来直接决定结果的正负; 而且这样就不需要两个字符数组了

C语言--字符数组

蹲街弑〆低调 提交于 2020-01-22 02:45:15
一、PTA实验作业 题目1:7-1 字符串转换成十进制整数 1. 本题PTA提交列表 2. 设计思路 主要思路流程: 筛选出十六进制字符和负号: 遍历数组ch1并计算十进制整数number: 判断十进制整数number的符号并输出: 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明。 问题1:不知道怎么把字母字符转化成整数计算 解决办法:网上百度。例:n=B-‘A’+10; 问题2:答案部分正确,不知道如何处理负号,输出的数没有正负之分 解决办法:在设计一遍算法,理一遍思路。最后重新把思路整理为定义一个数组存放筛选出来的字符串,如果这个数组的第一个字符是负号,则这个数是负数。 题目2:找最长的字符串 1. 本题PTA提交列表 2. 设计思路 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明。 问题: 错因: 题目3:指定位置输出字符串 1. 本题PTA提交列表 2. 设计思路 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明。 一开始写的时候没有注意ch1和ch2也是要输出的。 二、截图本周题目集的PTA最后排名。(2分) PTA排名 三、同学代码结对互评(1分) 1.互评同学名称 2.我的代码、互评同学代码截图(此处截图核心代码就好,不一定截图全部代码,图上指明是谁的代码。) 3.我和同学代码不同在哪里?有哪些各自优势

双指针算法:数组元素的目标和

六月ゝ 毕业季﹏ 提交于 2020-01-22 02:16:33
题目链接:https://www.acwing.com/problem/content/802/ 题意 :给定两个 升序 排序的有序数组A和B,以及一个目标值x。数组下标从0开始。 请你求出满足A[i] + B[j] = x的数对(i, j)。 数据保证有 唯一 解。 数据范围 数组长度不超过100000。 同一数组内元素各不相同。 1≤数组元素≤109 输入样例: 4 5 6 1 2 4 7 3 4 6 8 9 输出样例: 1 1 思路 :两个单调数组,显然就可以用双指针来优化一下啦。 代码实现: # include <bits/stdc++.h> using namespace std ; typedef long long ll ; const int INF = 0x3f3f3f3f ; const int N = 1e5 + 5 ; int n , m , x ; int a [ N ] , b [ N ] ; int main ( ) { ios :: sync_with_stdio ( 0 ) ; cin . tie ( 0 ) ; cout . tie ( 0 ) ; cin >> n >> m >> x ; for ( int i = 0 ; i < n ; i ++ ) cin >> a [ i ] ; for ( int j = 0 ; j < m ; j +

指针变量后面的中括号数组表示什么意思?

こ雲淡風輕ζ 提交于 2020-01-22 01:25:28
在看etherCAT_slave_c28x_hal.c代码块的时候遇到如下写法: /******************************************************************************************/ 解析: 1、其中:对于表达式pEsc[((offset<<1))],C语言处理成运算符,pEsc[((offset<<1))] 等价于 *(pEsc+(offset<<1)), 因为:在C语言里,指针和数组关系密切。*pEsc, 一旦有指向地址后,就可以看成 一维数组pEsc[], 哪种形式便于阅读理解,就可以用哪种形式,所以pEsc[((offset<<1))] 等价于 *(pEsc+(offset<<1))。 2、在编译器看来数组名与指针是同一概念,比如这里的st其实就是*st,在编译器编译时,自动会把所有的[]处理为*()(声明除外)。比如st[5]编译时就变成了*(st+5),ps[i]就是*(ps+i)。 3、malloc叫动态内存分配,是在程序运行时分配的内存,内存区域为动态如;数组是在编译时分配,所以定义时需要给定明确的长度,分配的内存在静态区。至于你说的指针用下标取值,其实是因为数组用下标取值其实是先转化为指针的——a[i]先转化为*(a+i)。 4、至于(volatile uint16_t *

C基础第28课--指针和数组分析(上)

南楼画角 提交于 2020-01-22 00:51:34
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。 实验1 #include <stdio.h> int main() { int a[5] = {0}; int* p = NULL; printf("a = 0x%X\n", (unsigned int)(a)); printf("a + 1 = 0x%X\n", (unsigned int)(a + 1)); printf("p = 0x%X\n", (unsigned int)(p)); printf("p + 1 = 0x%X\n", (unsigned int)(p + 1)); return 0; } mhr@ubuntu:~/work/C$ mhr@ubuntu:~/work/C$ ./a.out a = 0xCD11B2D0 a + 1 = 0xCD11B2D4 p = 0x0 p + 1 = 0x4 mhr@ubuntu:~/work/C$ mhr@ubuntu:~/work/C$ 实验2 #include <stdio.h> int main() { char s1[] = {'H', 'e', 'l', 'l', 'o'}; int i = 0; char s2[] = {'W', 'o', 'r', 'l', 'd'}; char* p0 = s1; char* p1 =