华为技术一面
先介绍项目经历
然后会问项目的你负责的
问难点,解决方法
四个笔试题
1,给出40亿个unsigned int数,再给出一个数,如何快速的判断这个数在不在40亿个数字之中,内存20G(储存数据结构,方法)
用bitmap,映射
2一个数组,奇数放数组前面,偶数放后面,时间O(n),空间O(1)
用两个索引,一前i一后j,a[i]是奇数,i++;不是与a[j]交换,j–,再判断a[i],知道i==j
3,一组数字,有一个元素只出现一次,其余元素都出现两次,如何快速找到那个只出现一次的
空间O(1)->先排序,再找
还有办法做到时间O(n)->暂时不知道,在学习
4,手撕题
给出升序数组,目标数字,找出数组中两个元素的和为目标的下标
考虑时间空间最优
#include<iostream>
using namespace std;
bool getIndex(int num[],int len,int target,int &index1,int &index2)
{
int i=0;
bool ret=false;
while(i<len&&target>num[i])
i++;
int j=i-1;
for(;j>0;j--)
{
for(i=0;i<j;i++)
{
if(target==num[j]+num[i])
{
index1=i;
index2=j;
ret=true;
}
}
}
if(ret)
{
index1++;
index2++;
}
return ret;
}
int main()
{
int num[4]={2,7,11,15};
int target=18,index1=0,index2=0;
bool ret = getIndex(num,4,target,index1,index2);
if(ret)
cout<<"index1= "<<index1<<"index2 ="<<index2<<endl;
else
cout<<"NONE"<<endl;
return 0;
}