前段时间去面阿里巴巴,虽然最后以失败告终(其实自己也不知道自己在面试的时候范了什么错误),但是发现阿里巴巴面试官提出的几个问题还是挺有“收藏价值”的所以写了这篇博客:
题目:对于一个从小到大的数组,并且给定另外一个数据data,要求从数组中找到两个数据,要求两个数据之和为data, 要求在O(n)时间复杂度内求解问题。
代码:
#include <stdio.h>
int array[]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int length=10;
int f(int data)
{
int* prior=array;
int* back=array+length-1;
while(prior<back)
{
int temp = *prior+*back;
if(temp==data) return true;
else if(temp>data) back--;
else prior++;
}
return false;
}
int main(void)
{
printf("%d\n", f(10));
getchar();
return 0;
}
类似的题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
#include <stdio.h>
int array[] = {1, -2, 3, 10, -4, 7, 2, -5};
int cal()
{
int max=0;
int current=0;
for(int i = 0; i < 8; i++)
{
if(current>=0)
{
current+=array[i];
}
else
{
current=array[i];
}
if(current > max) max=current;
}
return max;
}
int main(void)
{
printf("%d\n", cal());
getchar();
return 0;
}
待续.....