首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

小弟我出的一道面试题,95%的人写不出,大家看看是否太难

2013-04-26 
我出的一道面试题,95%的人写不出,大家看看是否太难不得不说,招人很难,我接手公司招聘工作一年多了,但几乎

我出的一道面试题,95%的人写不出,大家看看是否太难
不得不说,招人很难,我接手公司招聘工作一年多了,但几乎招不到人,有4/5的人对面试邀请爽约,而剩下的1/5的人中又大多数发觉很不合适,好不容易觉得合适,最后还不来。我为了面试最初一共出了6道题目,后来感觉有点多,删掉了4道,后来还是觉得有点多,又删掉了一道,只剩这道题,大家别笑,在开始做题前我都在应聘者旁边图文声色俱全耐心讲解了如何解答:什么是链表?如何插入?如何删除?笔试者其实只需要按照我说的写一点代码即可,可事实上真正能完成这道题目的人我只遇到一个,大多数都交了白卷(时间大约20分钟),好吧,我把这道题目原原本本贴在这里,一个字不变:

----题目开始----

实现一个链表,要求各个节点的Name都不重复,若试图增加重复节点,就抛出异常,填写下面的Append方法和Remove方法的代码。


class Node
{
    public string Name{get;set;}
    public int Score{get;set;}
    public Node Next{get;set;}
}

class Link
{
    public Node Head {
        get{return m_nodeHead;}
    }
        
    public void Append(string strName, int iScore)
    {
        //Add a node: implement your code here 















    }

    public void Remove(string strName)
    {
        //Delete a node: implement your code here 












    }

    private Node m_nodeHead = new Node(){
        Name="_HeadNode",
        Score=0,
        Next=null};
}


----题目结束----

大家结合我前面说的情况,认为题目难度如何?也许你觉得代码风格上有点奇怪,是的,我曾经是Windows C++程序员,后来将Windows C++编程的风格带入.net开发中来,用得也挺好的。 笔试
[解决办法]
搞.net的人至少90%都只能算是代码工人。
根本没学过或者没用心的学过基础课程。
所以造成了.net名声越来越臭
[解决办法]
    我们当然学习数据结构,但是我觉得你应该考虑你们公司现在的需求,你要求应聘者做这样的题目,如果只是为了考验他们的数据结构学的好不好,我觉得没有必要;如果你们需求需要用到这些,那可以,这样的题目也不是很难,几乎是很简单的关于单链表的操作。
    现在的问题是大学里面学习了很多的关于数据结构的东西,但是参加工作之后很多的都没有用到。这些基本的东西也就似乎给忘记了,但是大体的思路还是记得的,你这道题很具体的要求应聘者写代码,似乎真的难住他们了。
    比如我前段时间就学习了单链表的东西,但是现在让我做这道题,我有思路,代码似乎真的写不出了。不过我可以参考文档什么写出来。很多的东西不是一定要熟记于胸的,知道思路查些文档就解决了。
[解决办法]
坦白来讲,楼主这个题目出的挺好的,没有故意难为别人的意思。但是如果有人确实不知道链表是什么,你也可以向他解释一下,因为知道叫什么倒不重要,关键是得能写出代码。
[解决办法]
引用:
不知LZ是做哪方面的
.net的List,Dictionary都已经封装好了,为啥非要把C++的东西搬过来

我觉得楼主主要是想考察一下面试者的基本功,因为这个题无非就是写两个循环而已。很多求职者说的天花乱坠,但是确实只会拖控件,所以用这个题可以稍微过滤一下。
[解决办法]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NodeTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Link link = new Link();



            link.Append("1", 1);
            link.Append("2", 2);
            link.Append("3", 3);

            link.Print();

            Console.WriteLine();
            link.Remove("2");

            link.Print();
            Console.ReadKey();
        }
    }

    class Node
    {
        public string Name { get; set; }
        public int Score { get; set; }
        public Node Next { get; set; }
    }

    class Link
    {
        public Node Head
        {
            get { return m_nodeHead; }
        }

        public void Append(string strName, int iScore)
        {
            //Add a node: implement your code here 
            Node _node = m_nodeHead;
            Node _preNode = null;
            while (_node != null && _node.Name != strName)
            {
                _preNode = _node;
                _node = _node.Next;
            }
            if (_node != null)
            {
                throw new Exception(strName + "已存在");
            }
            else
            {
                _node = new Node { Name = strName, Score = iScore, Next = null };
                _preNode.Next = _node;
            }

        }

        public void Remove(string strName)


        {
            //Delete a node: implement your code here 
            Node _delNode = m_nodeHead;
            Node _preNode = null;
            while (_delNode != null && _delNode.Name != strName)
            {
                _preNode = _delNode;
                _delNode = _delNode.Next;
            }

            if (_delNode != null)
            {
                _preNode.Next = _delNode.Next;
            }
        }

        public void Print()
        {
            Node _node = m_nodeHead;
            while (_node != null)
            {
                Console.Write(_node.Name + " -> ");
                _node = _node.Next;
            }
        }

        private Node m_nodeHead = new Node()
        {
            Name = "_HeadNode",
            Score = 0,
            Next = null
        };
    }

}


[解决办法]
面试就应当出这种题,考察基本功,考察一点点逻辑思维。
[解决办法]
引用:
引用:搞.net的人至少90%都只能算是代码工人。
根本没学过或者没用心的学过基础课程。
所以造成了.net名声越来越臭
未必吧
你的意思是.net 之外的大部分很厉害啦?
代码只是实现的方式不同而已,思想才是重要的。
这和.net 有啥关系?

和.net没关系?为什么这么多没基础的人搞.net,还不是市场上那么多XX学校,XX培训,鼓吹学这个挣的多,傻瓜也能学,搞的饭店炒菜的,修理厂修车的,做鸡蛋灌饼的,这些行里面做不下去的人都来做.net。门槛太低,最后的结果就是搞臭自己。技术毕竟不是产品,技术的名声臭了就没救了,产品名声臭也可以挣钱,但是技术不行。
[解决办法]
public void Append(string strName, int iScore)
        {
            //implement your code here.
            Node next = new Node() { Score = iScore, Next = null, Name = strName };


            if (Head.Next == null && Head != next)
            {
                Head.Next = next;
            }
            else
            {
                if (Head == next)
                {
                    throw new Exception("");
                }
                else
                {
                    m_nodeHead = Head.Next;
                    Append(strName, iScore);
                }
            }
        }

        public static bool operator ==(Node n1, Node n2)
        {
            return object.Equals(n1.Name, n2.Name);
        }

        public static bool operator !=(Node n1, Node n2)
        {
            return !object.Equals(n1.Name, n2.Name);
        }


没试过 不知道对不,楼主看看
[解决办法]
恩,就要考这种基础的。
我出面试题,全围绕字符串和数组的,和语言具体技术无关的,哈哈。
[解决办法]
    public class Node
    {
        public string Name { get; set; }
        public int Score { get; set; }
        public Node Next { get; set; }
    }

    public class NoDuplicateNameLinkList
    {
        private Node m_nodeHead = new Node { Name = "head", Score = 0, Next = null };
        public Node Head { get { return m_nodeHead; } }

        public void Append(string strName, int score)
        {

            Node loopNode = Head;//指向头节点



            while (loopNode.Next != null)//遍历列表
            {
                loopNode = loopNode.Next;
                if (loopNode.Name.Equals(strName))//重复抛出异常
                {
                    throw new Exception();
                }
            }
            if (loopNode.Next == null)//列表末尾
            {
                Node addNode = new Node { Name = strName, Score = score, Next = null };
                loopNode.Next = addNode;
            }
        }

        public void Remove(string strName)
        {
            Node loopNode = Head;//指向头节点

            while (loopNode.Next != null)//遍历列表
            {
                Node nextNode = loopNode.Next;
                if (nextNode.Name.Equals(strName))
                {
                    if (nextNode.Next == null)
                        loopNode.Next = null;
                    else
                    {
                        loopNode.Next = nextNode.Next;
                        break;
                    }
                }
            }
        }
    }


没有验证过,不知道对不?
[解决办法]
恩,头节点给了,然后就是迭代。Append函数 就是查询Node Next为null的对象并赋予Node对象,Remove 也是同样的原理。


[解决办法]

引用:
搞.net的人至少90%都只能算是代码工人。
根本没学过或者没用心的学过基础课程。
所以造成了.net名声越来越臭

你太乐观了,应该是98%以上。
[解决办法]
引用:
有心了,这就是我想要的结果。面试有时候也挺纠结,考业务,不现实,因为每家公司都不一样,靠具体的技术,同样也是,所以只好考考基本功。 


这种题都做不出来,我这里是不会要的.

不过话说回来,技术难度永远比不上业务难度,对程序员来说业务需求才是最复杂的.
[解决办法]
这个,怎么说,会者不难,难者不会。
但是对于应聘程序员的人来说,怎么展现自己的逻辑和代码能力来说应该还是可以考量下。即便不知道链表是什么,当楼主讲了链表是什么后,应该首先有正确的程序结构和实现逻辑。
------------
另问下,现在的一般的招聘考代码是拿笔写纸上还是在机器上实际演练。

要写纸上的话,难度还是大的, 基类的成员要正确写出来还是属于记忆力的干活!
[解决办法]
现在很多人编程都只会用一下API,等换一个语言又得学另一种API,这个单向链表是数据结构的入门课程吧,如果连这个都不会,那更不用说树图这些东西了,知其然,不知其所以然,永远只能跟着别人的屁股跑,虽然表面上这些东西用不上。但用来检查功底是很好的...建议还出一些算法题...
[解决办法]
知道个链表就要1W/月啊?就要说“.net程序员就该不懂链表”啊?那不就是狮子大开口了么。

不可否认.net很时髦。但是这正说明它有用。因此我们对于那些什么学校的老师上门推销来的一堆学生,应该立刻拒绝。我们应该多面试那些自己主动找工作的人。

c++程序员的开发效率、工资和产出的“性价比”显然不一定高于.net程序员的。实际上你招聘时就是要多花点精力。
[解决办法]
这个,要是我应试的话也不定一下做出来,如果是招二年内毕业的,这题应该不难。我平时只有用的时候才去想这个,用什么样的算法与具体业务需求相关,有时写出来了,反道叫不出算法的名称,就我多年的经验,一个真的程序中,大多时是混合算法多些,平时我给别人提供框架和基础架构时,基本不想用什么算法,用什么设计模式,一切服务于业务,安全、运行环境下的要求的效率。
要真招个人,出个简单的业务,上机,给他一个大的技术范围要求,然后就随便他用什么方法做出来,再评分更好些
[解决办法]
引用:
引用:引用:弱弱的问一句,你招人给的工资是多少

工资都是“面议”,另外我只是负责技术这块,具体多少钱还得我的上级决定的。你没最低价,现在3000块左右的你指望会这个?你不知道最低价。。。。那你能找到人才怪


我也这么觉得,“例:你要招的人是1000块的”你按3000块的标准去找人..能找到人也才怪,即使找到了,人家愿意给你干3000块钱的活?
[解决办法]
引用:
不得不说,招人很难,我接手公司招聘工作一年多了,但几乎招不到人……

你们公司让一个技术人员去负责招聘?我觉得不大合适
招聘起码要做到的是明码标价,比如,你的最低月薪是3k(保险福利另算),那么最高工资就是6倍(18K)
这样的话,招人的时候,你们只招聘最初级的,门槛越低越好,
中高级完全靠自己培养,晋升

人力资源选人的条件主要是看基本素质,比如待人接物的风格和学校的学习态度,还有一些基本的技术能力
这些从简历上就可以考出来,
那些投简历的人,自己简历上吹嘘的是什么,我们就调查他什么

至于上岗资格,放在培训阶段解决,通过测试的,就可以上岗,
还有一点,小微企业尤其要自己培养人才,要舍得在人力资源建设上投入,要舍得在生产工具研发上投入
[解决办法]
人力资源总体趋势是:
个人能力将越来越弱,(软件)生产将越来越依赖团队能力
如果你们企业招人很难的话,那就意味着:
你不能用的人,别人一定能用;
如果你们企业人员离职频繁的话,那就意味着:
你用不好的人,别人一定能用好
如果情况刚好相反的话,那就意味着:
你们企业在人力资源的竞争中拥有优势地位

[解决办法]
我觉得楼主考这个问题没有什么过错啊,面试毕竟时间很短,如果是计算机系的,考一点基础的代码编写是很常见的。这个题目本身并不涉及到太多语言的东西,同样的题目可以用很多语言来写。我们公司一般在面试的时候,只会提一个问题,然后让面试的人自己选择用什么语言来实现。如果是楼主这个题目,在我看来,我只是想看看面试者基本的coding skill。对语言的熟悉,对各种平台的API的熟悉这个来自学习和经验,做做就会有了,但是不管你做什么产品,熟悉多少API,你必须得有一个解决问题的思路,你才能灵活运用这些设计好的API,事半功倍。所以考察基本的编程技巧很好,而且这个题目写完最简单的版本,基本就是一个个顺序的比较Name,还可以考虑让面试者想想优化的方法,比如,插入时对Name按照一个顺序来插入到特定的位置,那么比较有没有重复的时候就会快很多。等等,基本面试时间那么短,考虑解决问题的思路最重要,语言平台那是可以慢慢弥补的
[解决办法]
引用:
个人不太喜欢面试还要做题的,一道还好说,一坨的更讨厌。交流下思路不就可以了么,非要白纸黑字么
牛逼公司必做,而且还都是手写,google、微软那种就算有很好的思路写不出来一样白搭。。。

热点排行