上周去一个公司面试,时候询问hr才知道面试我的人是原.net版版主sunmast,微软某年的Mvp,问的问题不变态,很普通,但是自己答的也不怎么样,拿出来和大家分享吧。
1.现在用.net哪个版本(这个问题就随便聊了下)
2.一个小应用程序,占的内存太大,你会怎么检查。
3.值内型和引用内型分别存哪?值内型要存进堆怎么整?
4.一个已经排好序的数组去掉重复数字,尽量快。
5.        *
         ***
        *****
         ***
          *
一个循环打印出上面那种图(奇数行)

解决方案 »

  1.   

    1.现在用.net哪个版本(这个问题就随便聊了下)    -- 我用2003/2005
    2.一个小应用程序,占的内存太大,你会怎么检查。   -- 先查缓存是否被滥用
    3.值内型和引用内型分别存哪?值内型要存进堆怎么整? -- 自己都回答了,值分配堆,引用分配栈
    4.一个已经排好序的数组去掉重复数字,尽量快。 -- 冒泡?
      

  2.   

    原.net版版主sunmast该出来顶上........
      

  3.   

    31楼也太业余了?问你用.net那个版本,你回答VS版本干什么? 
      

  4.   

    4.一个已经排好序的数组去掉重复数字,尽量快。 
    -----------
    直接用Items[i]去和Items[i+1]比较  相等就remove掉 如何?
      

  5.   

    to:Error_Code你的回答可能是对方最不想见到的回答.
    你这样造成几乎是n*n的复杂度实际这个问题是可以在O(n)内解决的.不过问问题的人问的是一个"已经排好序"的数组去掉重复数字
    我感觉他是想到了二分查找/二叉树之类的算法,会产生O(Log n)复杂度实际上不管是否排好序都可以达到更快的O(n)
    只要数组范围在比较小的范围,都可以牺牲空间,换取时间,用类似桶排序的办法.
    如果超过这个范围,用哈希表也是基本可以达到O(n)所以我推测速马算法有研究的盲区,那就是哈希!~~~
      

  6.   

    c,cpp下一般这么做。c#下应该返出个list什么的可能看着更顺点眼。修改一下就可以了。
    总之结果会存在sortedArray的前半段长度为len的地方。
    public static void RemvoeRedundant(int[] sortedArray, ref int len)
    {
        int cnt = 0;
        for (int i = 1; i < len; i++) {
            if (sortedArray[i] != sortedArray[i - 1]) {
                sortedArray[++cnt] = sortedArray[i];
            }
        }
        len = cnt + 1;
    }
    不敢保证这时最快的!只敢说这不是最慢的。
      

  7.   

    另,小程序可以占大内存这没什么好奇怪的。比如你load一个大的xml文件。比较难缠的是当你用类似sos监察内存占用时,有许多间隙的小的free内存。这倒是需要优化的。
    另外就是内存泄漏。.net也会泄漏内存的,而且还不好解决。
      

  8.   

    4.一个已经排好序的数组去掉重复数字,尽量快。 public int [] c4(int[] data)
    {
        List<int> r = new     List<int>();
        for (int i = 1; i < len; i++) {
            if (data[i-1] != data[i]) {
                r.Add(data[i]);
            }
        }
        return r.ToArray();
      

  9.   

    public int [] c4(int[] data)
    {
        List<int> r = new     List<int>();
        for (int i = 1; i < len; i++) {
            if (data[i-1] != data[i]) {
                r.Add(data[i]);
            }
        }
        return r.ToArray();
      

  10.   

    to:46楼 superdullwolf
    已经排好序 重复的数字肯定是相邻的
    n*n的复杂度是怎么来的我不是很明白  劳烦阁下可否解释一下?
      

  11.   

    int data[];if(data.Length < 2)
        return data;int pos = 0;
    for(int i = 0; i < data.Length; ++i)
    {
        int temp = data[i];
        if(temp != data[pos])
        {
            data[pos++] = temp;
        }
    }
    int[] ret = new int[pos + 1];
    for(int i = 0; i < ret.Length; ++i)
    {
        ret[i] = data[i];
    }
    data = ret;
      

  12.   


    一个小Bug……应该先把data[0]加到r里去……
      

  13.   

    int data[];if(data.Length < 2)
        return data;int pos = 0;
    for(int i = 1; i < data.Length; ++i)
    {
        int temp = data[i];
        if(temp != data[pos])
        {
            data[pos++] = temp;
        }
    }
    int[] ret = new int[pos + 1];
    for(int i = 0; i < ret.Length; ++i)
    {
        ret[i] = data[i];
    }
    data = ret;
      

  14.   

    个人觉得第二题是个聊天题主要是要考虑到DEBUG思路,大的循环中就很容易出现这个问题
      

  15.   

    个人觉得第二题是个聊天题主要是要考虑到DEBUG思路,大的循环中就很容易出现这个问题
      

  16.   

    1.现在用.net哪个版本(这个问题就随便聊了下) ,1.1,2.0,3.5
    3.值内型和引用内型分别存哪?值内型要存进堆怎么整? 装箱.
    4.一个已经排好序的数组去掉重复数字,尽量快。 第N个与第N+1个比较,如果一样,去掉N+1,再与"N+2"个比较,就是与下一个N+1个比较.
      

  17.   

    不知道你怎么推出的 O(n*n),
    原序列已经排好序了, 那只要另外申请一个最少和原序列一样大的数组 newlist, 一个 lastnum 记录当前处理的数
    依次遍历原序列 newnum, 只要 newnum != lastnum, 就 newlist.add(newnum), newnum = lastnum 就可以了
      

  18.   

    2.一个小应用程序,占的内存太大,你会怎么检查。 这是一个很广的命题, 小应用程序是指什么,JS,EXE,CLR EXE,....根据题意;我们假设是一个小的.NET程序。再看有没有提供源码,有 DUBUG跟踪,找出托管资源有没有及时释放,有没有关系IO资源,...
    否 看看能不能反汇编成源码, 代码可能混淆了,继续以上如果都不能,使用进程跟踪工具,看看它是否再进行IO,SOCKET等资源操作。如果都没有,假设程序内部做了一些死循环,多余的操作,错误的操作..........
    这个没有完整答案   考官可能就是想看看你的想法新颖的(也许想吸收你的想法呢)