`
chriszeng87
  • 浏览: 741020 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【EMC笔试题】N个整数中找出三个数,使其和的绝对值最小

 
阅读更多

转自:http://blog.csdn.net/BusyCai/article/details/6155929

 

题目描述:给定包含N个数的无序数组S(可能包含负数,0,正数)。求三个数A,B,C,使其和的绝对值最小。

例如:S={-9,0,1,3,6},A=-9,B=3,C=6,MIN=0
算法解析:
解法一:枚举3个数,O(N*N*N)

解法二:对S排序后枚举其中2个数,二分查找另一个数。O(N*N*LOGN)

解法三:对S排序后枚举其中1个数X,使用双向指针i,j从数组两端更新(注意剔除X)。根据S[I]+S[J]+X的正负号来更新I或J。若为负则I++,否则J--。一旦和为0即退出。同时根据每次得到的和来更新best。最后best即为所求。利用三个变量X,Y,Z记录,可得到任一最优解。复杂度O(N*lOGN+N*N)=O(N*N)

 

期待更好解法 :)

例如S={-9,0,1,3,6,10}
X=-9
0 1 3 6 10
i           j
X+S[i]+S[j]=-9+0+10=1 > 0 j--
0 1 3 6 10
i        j
X+S[i]+S[j]=-9+0+6=-3 < 0 i++
0 1 3 6 10
    i      j
X+S[i]+S[j]=-9+1+6=-2 < 0 i++
0 1 3 6 10
     i   j
X+S[i]+S[j]=-9+3+6=0 = 0 quit
MIN=0,X=-9,Y=3,Z=6;
-----------------------------------------------------------------------------
算法二没看懂啊

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
using std::sort;

int main()
{
    int a[100], b[100];
    int X,Y,Z;
    int i, j, k;
    int best;
    srand((unsigned)time(NULL));
    int KASE = rand()%10;
    for(int kase = 1; kase <= KASE; kase++){
    printf("/nCase #%d :/n", kase);
    int n = rand()%20;
    if(n <= 2) { printf("Sorry, n is less than 3. /n"); continue; }
    for(i = 0; i < n; i++){
         a[i] = rand()%100;
        if(rand()%2) a[i] *= -1;
    }
    sort(a,a+n);
    for(i = 0; i < n; i++) printf("%d ", a[i]); printf("/n");
    int STD = 1000000;
    for(i = 0; i < n; i++)
        for(j = i+1; j < n; j++)
            for(k = j+1; k < n; k++)
                if(abs(a[i]+a[j]+a[k]) < STD){
                     X = a[i]; Y = a[j]; Z = a[k];
                    STD = abs(a[i]+a[j]+a[k]);
                }
    printf("STD answer is: MIN=%d, X=%d Y=%d Z=%d/n", STD, X, Y, Z);
     best = 1000000;
    for(i = 0; i < n; i++){
        int cur = a[i];
        int cnt = 0;
        for(j = 0; j < n; j++){
            if(j != i) b[cnt++] = a[j];
        }
        int head = 0, tail = n-2;
        while(head < tail){
            int now = cur + b[head] + b[tail];
            if(now == 0 || abs(now) < best){
                 best = abs(now);
                 X = cur;
                 Y = b[head];
                 Z = b[tail];
                if(now == 0) break;
            }
            if(now < 0) head++;
            else tail--;
        }
        if(best == 0) break;
    }
    printf("My answer is: MIN=%d, X=%d Y=%d Z=%d/n", best, X, Y, Z);
    }
    system("pause");
}

分享到:
评论

相关推荐

    EMC笔试题面经整理

    EMC笔试题面经整理EMC笔试题面经整理EMC笔试题面经整理

    EMC笔试题和面试题

    作者被要求解决一系列算法问题,例如在2n+1个数中找出唯一出现一次的数。作者首先提出了一种可能的解决方案,然后不断优化,最终提出了一个时间复杂度为O(n),空间复杂度为O(1)的高效算法。面试官对于作者这种从粗略...

    2007年emc笔试题

    通过以上对2007年EMC笔试题的部分分析可以看出,EMC公司在招聘过程中非常注重应聘者的基础知识掌握程度和个人偏好。多项选择题部分的设计旨在考察应聘者在数学逻辑、算法等方面的能力,而信息收集部分则帮助公司更好...

    EMC 面试笔试必备

    EMC(全称是"Enterprise Memory Cache",在本文中主要指代EMC公司)是一家全球知名的存储解决方案提供商,尤其以其在数据存储、备份、恢复和云计算服务领域内的专业技术而闻名。EMC面试笔试必备的知识点涵盖了多个...

    emc 2007 应届生 笔试题

    对于本题,可以通过列出所有满足条件的数(即形如\(n = 3k+1 = 5l+4 = 7m+3\)的形式),逐步找出最小的满足条件的正整数。通过计算,可以得出最小的符合条件的数为**104**。 以上是根据提供的笔试题内容所总结的...

    EMC笔试题答案(c++)

    EMC2009校园招聘笔试题答案,c++实现,可编译运行

    EMC 面试题 笔试题 面试经验 知识树

    通过上述知识点,我们可以看出EMC是一个在存储技术领域具有深厚积累和显著优势的全球性公司,其在技术研发、产品创新、企业文化和校园招聘等方面都有一系列成熟的做法和丰富的经验。对于求职者而言,EMC提供的不仅仅...

    北京华为经典笔试题(附答案)

    在当今竞争激烈的求职市场中,华为作为全球领先的科技公司,其招聘流程尤为严苛,尤其是笔试环节,更是成为了众多求职者挑战的起点。北京华为的经典笔试题,不仅是一份题库,更是检验应聘者是否具备华为所需专业素养...

    EMC 笔试资料精华

    例如,找出单向链表的倒数第k个节点,这类问题主要测试基本的数据结构操作和算法应用。 - **写作题**:用英语撰写一篇关于未来计算机发展的文章,既考察英语写作能力,也考察对行业的理解和前瞻性思考。 3. **面试...

    EMC2007笔试题

    【EMC2007笔试题】涉及到的是EMC公司2007年针对软件质量工程师一职的招聘笔试环节。EMC是一家知名的全球信息技术公司,主要提供数据存储、信息安全、云计算等解决方案。在这样的笔试中,考生可以期待遇到与软件测试...

    emc 中文题库.docx

    文档标题和描述中提到的是一个EMC相关的中文题库,主要涵盖了存储技术、虚拟化、数据管理和网络协议等多个IT领域的知识点。以下是对这些知识点的详细解释: 1. 结构化数据通常指的是数据库中的数据,例如关系型...

    EMC2010年校园招聘笔试题

    【EMC2010年校园招聘笔试题】是一份极具价值的历史资料,它记录了全球知名存储解决方案提供商EMC在2010年面向校园招聘时所使用的测试题目。对于那些希望进入EMC工作的求职者,这份资料具有很高的参考价值,能够帮助...

    应届生找工作+常见电子类硬件笔试题整理大全(含答案)+硬件工程师笔试试题集大全+模拟、数字电子技术

    在电子技术领域,尤其是对于应届毕业生寻找硬件工程师岗位的工作来说,掌握扎实的理论知识和实践...同时,不断更新和深入学习电子技术的新发展,如嵌入式系统、FPGA、物联网等前沿领域,将使你在求职过程中更具优势。

Global site tag (gtag.js) - Google Analytics