数组
- 没有引用数组,但是数组可以被引用。eg:int &a[10];//错误
- c风格的字符串
1)“acbd”//双引号括起来的字符串,因为末尾自动加了NULL,长度为5
2){‘a’,‘b’,’\0’}//末尾有‘\0’的字符数组 - 逗号运算
int a[3][2]={(0,1),(2,3),(3,4)};
int b[3][2]={1,3,4};
数组a、b等价,元素都为 1,3,4,0,0,0
因为逗号运算只保留最后一个表达式的值(赋值运算优先级大于逗号运算
4. 二维数组a[x][y]=一位数组b[x*列数+y]
5. 二维数组动态声明
int **a=new int*[m];
for(int i=0;i<m;++i)
a[i]=new int[n];//a[m][n]
动态声明的数组任意的a[k]都是int 类型,是一个地址,只能使用a[i][j]或者((a+i)+j)访问,不能使用a[in+j]
释放
for(int i=0;i<m;++i)
delete []a[i];
delete []a;
-
数组指针与指针数组
指针数组:int *a[10];数组中元素全为指针
数组指针:int (*p)[10];p指向大小为10的数组
*p 相当于指向一个一维数组
(*p)[10]相当于指向二维数组,每个行里面有10个元素
eg:
int a[3][4];
int (*p)[4]=w; -
指针问题
a=&a[0]
&a为a整个数组 &a+1跳过a中所有元素
(a+i)=a[i]
((a+i)+j)=(a[i]+j)=a[i][j]
&相当于往上加一层指针
*相当于解一层指针 -
数组中一个数字的出现次数超过了三分之一。(也可以计算等于二分之一,要求时间复杂度O(n),空间复杂度O(1))
由出现次数超过二分之一演化而来。
#include <string>
#include<iostream>
using namespace std;
int f(int data[], int n)
{
int num1=data[0];
int num2=data[0];
int cur1=0;
int cur2=0;
for (int i = 0; i < n; ++i)//取两个数记录次数
//这两数其中一个肯定最后剩下的次数大于0
//相当于把三个数一起比较,如果三个数都不一样减去次数
{
if (data[i] == num1)
cur1++;
else if (data[i] == num2)
cur2++;
else if (cur1 == 0)
{
num1 = data[i];
cur1++;
}
else if (cur2 == 0)
{
num2 = data[i];
cur2++;
}
else
{
cur1--; cur2--;
}
}
cur1 = 0; cur2 = 0;
for (int i = 0; i < n; i++)//比较这两数谁出现次数最大
{
if (data[i] == num1)
cur1++;
else if (data[i] == num2)
cur2++;
}
if (cur1 > cur2)
return num1;
else
return num2;
}
int main(){
int data[] = { 0, 1, 2, 2, 2,1 };
int ans = f(data, 6);
cout << ans << endl;
return 0;
}
字符串
- C风格字符串
c++通常使用char 或者const char操纵c风格字符串
const char *cp=“some value”
while(*cp){
//do something to cp
++cp
}
此时cp指向‘\0’时意义同0,会跳出while - 字符串处理函数
strlen(s)//计算长度,不包含‘\0’
strcmp(s1,s2)//相等,返回=0,s1>s2返回正数,反之返回负数
strcat(s1,s2)//s1+s2
strcpy(s1,s2)s1=s2
strncat(s1,s2,n)
strncpys1,s2,n) - 输入两个很大的正数(用C字符串表示),输出他们的乘积,将设不考虑非法输入。
#include<iostream>
#include<cassert>
void multiply(const char *a, const char *b)
{
assert(a != NULL && b != NULL);
int i, j, ca, cb, *s;
ca = strlen(a);
cb = strlen(b);
s = (int *)malloc(sizeof(int)*(ca + cb)); //分配存储空间
//两数乘积的长度不会超过两个数的长度之和
for (i = 0; i<ca + cb; i++)
s[i] = 0; //每个元素赋初值为0
for (i = 0; i<ca; i++)
for (j = 0; j<cb; j++)//按位乘运算
s[i + j + 1] += (a[i] - '0')*(b[j] - '0'); //两个嵌套的for循环,将字符串中的数字通过-‘0’
for (i = ca + cb - 1; i >= 0; i--) //转换为十进制数字
if (s[i] >= 10)
{
s[i - 1] += s[i] / 10;
s[i] %= 10;
}
char *c = (char *)malloc((ca + cb)*sizeof(char));
i = 0;
while (s[i] == 0)
i++;
for (j = 0; i<ca + cb; i++, j++) //将十进制数字转换为字符,存储到字符数组中
c[j] = s[i] + '0';
c[j] = '\0';
for (i = 0; i<ca + cb; i++)
std::cout << c[i];
std::cout << std::endl;
free(s);
free(c);
}
int main()
{
const char *strnum1 = "123";
const char *strnum2 = "456";
multiply(strnum1, strnum2);
return 0;
}