您的位置:首页 > 其它

微软实习生笔试

2010-11-22 23:58 260 查看
昨天第一次参加这种海笔,之前找实习的时候都是被关在一个小黑屋里孤独的写代码,有点小不适应。

啥都不说了,直接上大题。

求一个数列中,逆序对的个数,要求算法的时间复杂度为O(nlogn)。

O(n2
)的算法就不说了。

拿到这题,第一反应就是先将所有数快排序,然后拷贝到另一个数组中去,用原数组的数据做索引,二分查并删除找到的元素,返回这个元素之前的元素个数。后来写到一半的时候,发现这不就是二叉排序树么。。哎,不过写了就写了,就当是练兵吧。

//swap
void swap(int &a, int &b)
{
int tmp=a;
a=b;
b=tmp;
}
//partition
int partition(int *Array,int left,int right,int n)
{
int pivot=Array[left];
swap(Array[left],Array[right]);
int storeIndex=left;
for(int i=left;i<right;++i)
{
if(Array[i]<=pivot)
{
swap(Array[i],Array[storeIndex]);
++storeIndex;
}
}
swap(Array[storeIndex],Array[right]);
return storeIndex;
}
// 快速排序
void qSort(int *Array, int left, int right, int n)
{
if(right<=left)return;
int p=partition(Array,left,right,n);
qSort(Array,left,p-1,n);
qSort(Array,p+1,right,n);
}
//删除元素
void deleteEle(int index, int *Array, int n)
{
for(int i=index;i<n;++i)
{
Array[i]=Array[i+1];	// 后一个覆盖前一个
}
}
// 二分搜索
int BinarySearch(int *Array,int low, int high, int n, int x)
{
int mid=0;
while(low<=high)
{
mid=(low+high)/2;
if(Array[mid]>x)
{
high=mid-1;
}
else if(Array[mid]<x)
{
low=mid+1;
}
else
{
break;
}
}
deleteEle(mid,Array,n);
Array[n-1]=2000;
return mid;
}
//O(n*lg(n))
int reversePair2(int *array, int n)
{
int *tmpArray=new int
;
for(int i=0;i<n;++i)
{
tmpArray[i]=array[i];
}
int count=0;
qSort(tmpArray,0,n-1,n);
for(int i=0;i<n;++i)
{
int index=BinarySearch(tmpArray,0,n-1,n,array[i]);
count+=index;
}
delete [] tmpArray;
return count;
}


另外还考了图论,位运算,前缀后缀表达式,二叉树等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: