三、数组
1、指针数组,数组指针,指针函数,函数指针等的区别
int *ptr[]; int (*ptr)[]; int *func(int); int (*func)(int).由于添加括号造成的优先级不同
2、连续子数组的最大和
有时间复杂度的限定,必须考虑和小于0就直接舍去(剑指offer 171页)
//看到的内容仅仅是将之前数组的最大值保留
//将当前得到最大值与 目前存储的最大值进行比较
int maxSubArray(int A[],int length)
{
if (A == NULL || length == 0)
return 0;
int currentMax = A[0];//当前子数组的最大值
int max = A[0];//子数组最大值
for(int i = 1; i < length; i++)
{
currentMax = currentMax + A[i] > A[i] ? currentMax + A[i] : A[i];
max = currentMax > max ? currentMax : max;
}
printf("max sub array is %d",max);
return max;
}
3、寻找数组中出现超过一半的数字
判断下一个遍历的数字是否与之前保存的那个数字相同(剑指offer 165页)与 编程之美 上寻找“水王” 异曲同工。
//寻找数组中超过一半的数组
//删除两两不同的元素,最终剩余元素即为想要的元素
//还有没有其他的解决方案
void findNum(int numList[],int len)
{
int record = numList[0];
int count = 1;
for(int i = 1; i < len;i++)
{
if(count == 0)
{
record = numList[i];
count = 1;
continue;
}
if(numList[i] != record)
{
count--;
}else
{
count++;
}
}
printf("%d\n",record);
}
4、第一次只出现一次的字符
要考虑用hash表(剑指offer 187页)
//第一次只出现一次的字符
void findFirstSingle(char* str)
{
int record[26] = {0};
int len = strlen(str);
for(int i = 0; i < len; ++i)
{
int index = *(str + i) - 'a';
record[index]++;
}
char tmp;
for(int i = 0; i < len; ++i)
{
int index = *(str + i) - 'a';
if(record[index] == 1)
{
tmp = *(str + i);
break;
}
}
printf("%c\n",tmp);
}