数组

C语言数组

你离开我真会死。 提交于 2021-01-30 02:02:59
C语言中编译器不会为数组名分配内存,只会为数组中的每个元素分配内存(与指针的区别);对数组的访问可以通过指针或者下标的形式,但是不能直接对整个数组进行操作,也就是说数组名不能作为一个左值进行操作。下面对数组常见的几个问题进行代码示例。 数组的sizeof void array_size(int a[]) { printf("int a[10] as a parameter:\n"); printf("sizeof(a) = %d\n", sizeof(a)); int b[10]; printf("int b[10]:\n"); printf("sizeof(b) = %d\n", sizeof(b)); } 函数输出为: int a[10] as a parameter: sizeof(a) = 4 int b[10]: sizeof(b) = 40 sizeof(a) = 4 是因为数组作为函数参数会退化为指针类型,而sizeof(b) = 40则为数组b所占的内存空间大小。 2. 数组有关的地址问题 void array_addr() { int a[10]; printf("int a[10]:\n"); printf("&a = %p\n", &a); printf("a = %p\n", a); printf("&a[0] = %p\n", &a[0]); printf

php数组合并用加号和用array_merge()的区别

可紊 提交于 2020-04-24 23:07:42
第一先看数组元素: <?php$a = array('r'=>1,2,3,4); var_dump('a',$a); $b = array('r'=>5,6,7,8); var_dump('b',$b); $c = array('r'=>5,6,7,8,9); var_dump('c',$c); var_dump('a+b',$a+$b); var_dump('a+c', $a+$c); var_dump('amb', array_merge($a, $b)); var_dump('amc', array_merge($a, $c)); 第二看输出: string 'a' (length=1)array 'r' => int 1 0 => int 2 1 => int 3 2 => int 4string 'b' (length=1)array 'r' => int 5 0 => int 6 1 => int 7 2 => int 8string 'c' (length=1)array 'r' => int 5 0 => int 6 1 => int 7 2 => int 8 3 => int 9string 'a+b' (length=3)array 'r' => int 1 0 => int 2 1 => int 3 2 => int 4string 'a+c' (length

Java——流程控制与数组

混江龙づ霸主 提交于 2020-04-16 07:46:36
【推荐阅读】微服务还能火多久?>>> 一:顺序结构 从上到下顺序执行,中间没有任何判断和跳转。 二:分支结构: 1、if条件语句 if语句使用布尔表达式或布尔值作为分支结构来进行分支控制。 第一种形式: if(Logic Expression) { statement... } //{}里面是代码块,一个代码块通常被当做一个整体来执行 第二种形式: if(Logic Expression) { statement... } else { statement... } 第三种形式: if(Logic Expression) { statement... } else if(Logic Expression) { statement.... } //可以跟多个else if语句 else { statement... } //else可以省略 以上三种形式,放在if后面括号里的只能是一个逻辑表达式,这个返回值只能是true或false。不要省略花括号,哪怕只有一条执行语句或者是只有一个分号的空语句。如果省略if后面的花括号,那么if条件只控制到紧跟该条件语句的第一个分号处。在使用if...else语句时,一条基本规则:优先把包含范围小的条件放在前面处理。例子: public class Test { public static void main(String[] args) {

将有序数组转换为二叉搜索树

醉酒当歌 提交于 2020-04-08 14:04:16
题解思路: 二叉搜索树(Binary Search Tree)是指一棵空树或具有如下性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值 任意节点的左、右子树也分别为二叉搜索树 没有键值相等的节点 基于以上性质,我们可以得出一个二叉搜索树的特性:二叉搜索树的中序遍历结果为递增序列。 那么现在题目给了我们一个递增序列,要求我们构造一棵二叉搜索树,就是要我们实现这一特性的逆过程。 递归设计 函数作用:通过上述解题过程我们可以明确该问题的子问题是:构造树的每个节点以及该节点的左右子树。因此,递归函数的作用很明显: 选取要构造关系的节点并创建它 构造该节点的左子树 构造该节点的右子树 函数的输入为递增数组,函数的返回为完成构造的节点。 何时结束 当输入的递增数组为空时,只能构成一棵空树,此时返回空节点。 何时调用 当构造节点的左右子树时,对递增数组进行拆分并进行递归调用。 实现 Java /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */

黑马程序员——反射

孤街醉人 提交于 2020-04-08 06:46:28
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ---------- 一、概述 反射技术: 反射技术可以对类进行解剖。 二、应用场景 提供一个配置文件,来供以后实现此程序的类来扩展功能。对外提供配置文件,让后期出现的子类直接将类名字配置到配置文件中即可。该应用程序直接读取配置文件中的内容。并查找和给定名称相同的类文件。进行如下操作: 1)加载这个类。 2)创建该类的对象。 3)调用该类中的内容。 应用程序使用的类不确定时,可以通过提供配置文件,让使用者将具体的子类存储到配置文件中。然后该程序通过反射技术,对指定的类进行内容的获取。 好处:反射技术大大提高了程序的扩展性。    反射就是把Java类中的各种成分映射成相应的java类。 三、Class和class的区别 1)class:Java中的类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则由此类的实例对象确定,不同的实例对象有不同的属性值。 2)Class:指的是Java程序中的各个Java类是属于同一类事物,都是Java程序的类,这些类称为Class

C++ STL,list vector区别

拟墨画扇 提交于 2020-04-08 00:56:40
顺序性容器: 向量 vector : 是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。 在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector 默认指定,这个大小即capacity ()函数的返回值。当存储的数据超过分配的空间时vector 会重新分配一块内存块,但这样的分配是很耗时的,在重新分配空间时它会做这样的动作: 首先,vector 会申请一块更大的内存块; 然后,将原来的数据拷贝到新的内存块中; 其次,销毁掉原内存块中的对象(调用对象的析构函数); 最后,将原来的内存空间释放掉。 如果vector 保存的数据量很大时,这样的操作一定会导致糟糕的性能(这也是vector 被设计成比较容易拷贝的值类型的原因)。所以说vector 不是在什么情况下性能都好,只有在预先知道它大小的情况下vector 的性能才是最优的。 vector 的特点: (1) 指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组一样操作,并且可以进行动态操作。通常体现在push_back() pop_back() 。 (2) 随机访问方便,它像数组一样被访问,即支持[ ] 操作符和vector.at() (3) 节省空间

字符串和数组的相互转换

ε祈祈猫儿з 提交于 2020-04-07 20:54:48
1、字符转数组 String str = "0,1,2,3,4,5,67"; String [] arr = str.split(","); //split分割符 System.out.println(Arrays.toString(arr)); //[0,1,2,3,4,5,6,7] 2、数组转字符 String[] arr = { "0", "1", "2", "3", "4", "5" }; (1)循环 StringBuffer str5 = new StringBuffer(); for (String s : arr) { str5.append(s); } System.out.println(str5.toString()); // 012345(2)使用StringUtils的join方法//StringUtils.join():将数组或集合以某拼接符拼接到一起形成新的字符串 String str1 = StringUtils.join(arr); System.out.println(str1); // 012345 String str2 = StringUtils.join(arr, ","); // 数组转字符串(逗号分隔) System.out.println(str2); // 0,1,2,3,4,5(3) 使用ArrayUtils的toString方法

学习:字符串----KMP算法

限于喜欢 提交于 2020-04-07 20:42:40
KMP算法 是判断一个字符串 (模式串) 是不是另一个字符串 (文本串) 的子串的常用算法,其中KMP算法的失配指针的概念(在本算法也叫 next数组 )在AC自动机中也有突出使用。 朴素的字符串匹配算法 朴素的字符串匹配算法,即判断文本串的 以每一个字符为开头,与模式串等长的子字符串 是否与 模式串 本身相等。很明显复杂度为为 O(mn),其中m为文本串的长度,n为模式串的长度。具体实现如下图 上图是一个字符串朴素匹配的示意图,长度为4的模式串与文本串每一个连续的长度为4的子串进行匹配判断,每一次匹配判断都需要一个个字符比较。 朴素匹配的代码: int StringMatch(string s, string p){ //s为文本串,p为模式串 int sLen = s.size(); int pLen = p.size(); int i = 0; //i遍历文本串下标,j遍历模式串下标 int j = 0; while (i < sLen && j < pLen){ if (s[i] == p[j]){ //相同i和j一起加1 i++; j++; } else{ i = i - j + 1; //i指向文本串下一个子串的第一个字符。 j = 0; //不相同,j重新指向模式串第一个字符 } } if (j == pLen) return i - j; else return

C语言入门

淺唱寂寞╮ 提交于 2020-04-07 16:43:48
文章转自 https://www.imooc.com/course/programdetail/pid/37 c语言入门 C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言,所以说学习C语言是进入编程世界的必修课。 hello,world #include<stdio.h> int main() { /*在双引号中间输入Hello World*/ printf("Hello World"); return 0; } 注:在最新的C标准中,main函数前的类型为 int 而不是 void c语言的具体结构 简单来说,一个C程序就是由若干 头文件 和 函数 组成。 #include <stdio.h> 就是一条预处理命令, 它的作用是通知C语言编译系统在对C程序进行正式编译之前需做一些预处理工作。 函数 就是实现代码逻辑的一个小的 单元 。 必不可少之主函数 一个C程序有且只有一个主函数,即 main 函数。 C程序就是执行主函数里的代码,也可以说这个 主函数 就是C语言中的 唯一入口 。 而 main 前面的 int 就是主函数的类型. printf() 是 格式输出 函数,这里就记住它的功能就是在 屏幕上输出指定的信息 return

HDU 4812 (点分治)

大兔子大兔子 提交于 2020-04-07 12:05:05
题目: https://vjudge.net/contest/307753#problem/E 题意: 给你一颗树,树上每个点都有个权值,现在问你是否存在 一条路径的乘积 mod 1e6+3 等于 k的路径,如果有找到字典序最小的方案 思路, 树上路径~点分治 我们能知道每条路径的值,现在我们可以转化的问题是,怎么找一条路径等于K,和两条路径的乘积等于K, 首先第一种很明显就是判断相不相等即可,第二种的话,我们知道所有路径,我们怎么找到O(n)找到两个呢,我们用个数组存下所有是否出现过,然后,其实就是一个简单的小学问题,我们枚举每个距离的时候相当于 x,y,z已经知道 x,z了,式子是x*y=z,我们就只要判断z/x是否在标记数组中出现过即可,又因为这个有mod ,所以我们只能去乘z的逆元,这个时间卡的有点紧,我加了输入挂,和预处理逆元,map标记都不能用,只能用普通标记数组。 然后还有一个问题,你是否能和之前那样直接求出来所有的距离,答案是否定的,因为你直接去遍历数组标记,数组中的路径还含有两个都是同一子树的情况,这种时候是不能加入标记数组的,但是怎么避免呢,这里用到一个巧妙地方法,我们直接在计算所有路径到重心的距离的时候去更新答案,因为我们只有得到一个子树所有答案的时候才会存入标记数组,这样就避免一个子树的路径发生冲突的情况。最后我们再清空掉我们当前重心存入的答案。