您的位置:首页 > 职场人生

师兄面试总结编程部分解答之三

2014-08-27 20:23 246 查看
三、数组

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: