微软的一道面试题的解法

题目:

一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。
复杂度最好是O(n)

1. 初始化一个数组,长度为 N + 1; (iArray[N + 1])

2. 遍历数列,将数列中的元素依次填充到新申请的数组对应下标的位置上。(也就是说如果元素是5,那么 iArray[5] = 5)

    这样简单的实现了一种从大到小的排序(没有用那些复杂的排序算法,呵呵), 没有元素的位置上的值为0.

3. 由于和是 N + 1, 那么1 开始遍历iArray.

    如果找到一个下标为ix的元素不为0, 那么用 N + 1 - ix 得到了一个iPartner,如果iArray[iPartner] 不为0, 那么 ix 与 iPartner就是符合条件的数对.

    需要注意的是我们只需要找 N / 2次 就行了~~ 否则找出来的数对有可能会重复(如果没有次序要求的话).

4. 这个算法没有考虑整数溢出的情况~~!!(不晓的有没有空间复杂的的要求~~)

大概写了一个算法如下(C#)

Code


(文/DangYanbo  出处/博客园)

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Visual Studio.NET] 的这些文章也感兴趣:

.NET框架图解之五:System.Reflection
Typemock发布Isolator 5.1.1和Racer
DevXpress 控件: 第一篇: XtraPivotGridControl控件
.NET Framework3.0答疑
在 Visual Studio 中对断点进行分组管理
一个面向.NET Compact Framework的应用程序代码分析器
软件架构乱弹:问题域及其解决方法
ManagedDirectX--Alpha混合
.NET框架图解之三:System.IO
使用Visual Studio 2010从分析到实施(1)——安装Visual Studio 2010 CTP2