chapter1 数组
来源:互联网 发布:鲁班软件 北京 编辑:程序博客网 时间:2024/06/05 00:42
1.一维数组初始化:函数体外:初始化为0 函数体内:无初始化,初始化部分,则后面也会被初始化为0,不是默认类型则自动调用默认构造函数初始化
2. 定义一维数组的引用: int (&p)[6] = a;
3.c风格字符串与字符数组的区别:字符串后默认加上'\0',所以长度较字符数组多1(所以用字符串常量来定义字符数组时注意长度的问题)
4.字符串输出遇'\0'终止
5.二维数组的几种赋值方式:省略内嵌花括号的区别,
6.二维数组做函数参数,需要指明第二维的大小
7.行优先存储与列优先存储
8. 针对数组a[3][3]-->访问a[1][4] = a[2][1] = *(a+7);
9.二维数组的动态声明:先动态声明一维int* [m],再对一维的int *[i] -->a[i]动态声明二维的int [n]
int **a = new int* [m];
for(int i = 0; i < m; ++i)
a[i] = new int[n];-->对于m中的每行,有一个n 个数的一维数列
释放的时候先释放二维的delete []a[i],再delete [] a
访问:a[i][j] *(*(a+i) + j) 不能a [i * n + j]-->原因:静态数组是连续的,而动态数组不是
10.int a[3][4]-->a的类型int (*)[4] -->*(a+i)或者a[i] 的类型是 int *
*a是int * 类型 &a是int (*)[3][4]类型 **a 是int类型
int a[3] -->a的类型int*
11.数组的首地址是常量,不可变更
12.正数负数在内存中存储:存放补码,正数源码和补码一样,负数补码在源码基础上:符号不变,其他取反加1
输入16进制数和输入十进制数存储的不同,10进制需要转化成补码形式,而16进制直接相当于补码形式
(16进制数)0x12345678---->(内存中)78 56 34 12 -->小端存储模式
(10进制) 0xffffffff+1--> -(2的31次方)<---(16进制数)0x80000000-----> 00 00 00 08
注意的问题:16进制负数数作输入的时候,直接以小端模式按字节存入内存,而十进制负数来的时候要转换成补码格式
输入 -1-->0x80000001-->(补码)内存中0xffffffff 输出的时候 -->变回原码0x80000001-->-1
输入0xffffffff-->内存中0xffffffff, 输出:变成原码0x80000001--->-1
(16进制数)0x800000 00--->(内存小端存储)00000080--->输出: 16进制:0x80000000 十进制:-(2的31次方)
(16进制数 ) 0x ff ff ff ff ff --->(内存)ff ff ff ff--->输出: 16进制:0xff ff ff ff 十进制 :-1
(10进制数) -1 -->(内存)ff ff ff ff-->...
13.数组顺时针旋转90度
void rotate(int (*a)[3], int n){ int i, j; int top; for(i = 0; i < n/2; ++i) { for(j = i; j < n - 1 - i; ++j) { top = a[i][j]; a[i][j] = a[n-1-j][i]; a[n-1-j][i] = a[n-1-i][n-1-j]; a[n-1-i][n-1-j] = a[j][n-1-i]; a[j][n-1-i] = top; } }}
14.数组乘积,不能使用除法运算
src: a[4] = {2, 3, 4, 5} result:b[4] = {60, 40, 30, 24}
int *cal(int *input, int n){ int *arr = malloc(n *sizeof(int)); int i; arr[0] = 1; for(i = 1; i < n; ++i) arr[i] = arr[i-1]*input[i-1]; arr[0] = input[n-1]; for(i = n-2; i > 0; --i) { arr[i] *= arr[0]; arr[0] *= input[i]; } return arr;}
15.找出n个数中的最大的2个数的最少需要比较的次数:n +logn -2
参考http://blog.csdn.net/keyeagle/article/details/6107198
16. 求出一个数组中这样的a[i],左边的都比它小,右边的都比它大
思路:辅助数组:记录每个a[i]右边的最小值(包括它本身),比较两数组a[i] 和b[i] 相等的话且左边的最大值不比a[i]大表示满足条件
void func(int *arr, int n){ int min = arr[n-1]; int tmp[n]; int i; tmp[n-1] = arr[n-1]; for(i = n-2; i >= 0 ; --i)//从后向前生成右边最小数组 { if(arr[i] < min) min = arr[i]; tmp[i] = min; } int max = tmp[0]; for(i = 0; i < n; ++i)//从左到右找相等且左边最大值不大于a[i] { if(arr[i] < max) { continue; } max = arr[i]; if(max == tmp[i]) printf("%-3d", arr[i]); }}
17.一个数组中一个数出现的次数超过数组长度的一半
void func(int *arr, int n){ int signal_num; int count = 0, i; for(i = 0; i < n; ++i) { if(count == 0) { signal_num = arr[i]; count++; }else{ if(arr[i] != signal_num) count--; else count++; } } printf("%d\n", signal_num);}
1 0
- chapter1 数组
- Chapter1
- chapter1
- chapter1
- Chapter1
- chapter1
- chapter1
- chapter1
- BPM chapter1
- UNIX chapter1
- Chapter1-Chapter2
- chapter1 习题
- chapter1&&2
- chapter1 1
- chapter1. 开始
- chapter1-5
- LinuxShell Chapter1
- ICS Chapter1
- thrift通过TServerEventHandler获取客户端ip
- JSP的九大内置对象简述
- 【IOS 开发】Object - C 入门 之 数据类型详解
- 2015年阿里巴巴校园招聘研发岗在线笔试题(超全)
- MyEclipse 8.6 Loading com.genuitec.eclipse.sqlexplorer
- chapter1 数组
- HDU1757-A Simple Math Problem(矩阵快速幂)
- 敏捷开发方法强调实际交付价值而不是做出一些非凡的但是无法实现的计划和承诺
- Leetcode: Binary Tree Preorder Traversal
- 单链表排序(sort list)
- 1 网桥的原理及在linux内核中的实现
- iOS CoreData的基本用法
- 隐含的this指针
- Webservice之实现