我出的一道面试题,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名声越来越臭
[解决办法]
我们当然学习数据结构,但是我觉得你应该考虑你们公司现在的需求,你要求应聘者做这样的题目,如果只是为了考验他们的数据结构学的好不好,我觉得没有必要;如果你们需求需要用到这些,那可以,这样的题目也不是很难,几乎是很简单的关于单链表的操作。
现在的问题是大学里面学习了很多的关于数据结构的东西,但是参加工作之后很多的都没有用到。这些基本的东西也就似乎给忘记了,但是大体的思路还是记得的,你这道题很具体的要求应聘者写代码,似乎真的难住他们了。
比如我前段时间就学习了单链表的东西,但是现在让我做这道题,我有思路,代码似乎真的写不出了。不过我可以参考文档什么写出来。很多的东西不是一定要熟记于胸的,知道思路查些文档就解决了。
[解决办法]
坦白来讲,楼主这个题目出的挺好的,没有故意难为别人的意思。但是如果有人确实不知道链表是什么,你也可以向他解释一下,因为知道叫什么倒不重要,关键是得能写出代码。
[解决办法]
我觉得楼主主要是想考察一下面试者的基本功,因为这个题无非就是写两个循环而已。很多求职者说的天花乱坠,但是确实只会拖控件,所以用这个题可以稍微过滤一下。
[解决办法]
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没关系?为什么这么多没基础的人搞.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 也是同样的原理。
[解决办法]
你太乐观了,应该是98%以上。
[解决办法]
这种题都做不出来,我这里是不会要的.
不过话说回来,技术难度永远比不上业务难度,对程序员来说业务需求才是最复杂的.
[解决办法]
这个,怎么说,会者不难,难者不会。
但是对于应聘程序员的人来说,怎么展现自己的逻辑和代码能力来说应该还是可以考量下。即便不知道链表是什么,当楼主讲了链表是什么后,应该首先有正确的程序结构和实现逻辑。
------------
另问下,现在的一般的招聘考代码是拿笔写纸上还是在机器上实际演练。
要写纸上的话,难度还是大的, 基类的成员要正确写出来还是属于记忆力的干活!
[解决办法]
现在很多人编程都只会用一下API,等换一个语言又得学另一种API,这个单向链表是数据结构的入门课程吧,如果连这个都不会,那更不用说树图这些东西了,知其然,不知其所以然,永远只能跟着别人的屁股跑,虽然表面上这些东西用不上。但用来检查功底是很好的...建议还出一些算法题...
[解决办法]
知道个链表就要1W/月啊?就要说“.net程序员就该不懂链表”啊?那不就是狮子大开口了么。
不可否认.net很时髦。但是这正说明它有用。因此我们对于那些什么学校的老师上门推销来的一堆学生,应该立刻拒绝。我们应该多面试那些自己主动找工作的人。
c++程序员的开发效率、工资和产出的“性价比”显然不一定高于.net程序员的。实际上你招聘时就是要多花点精力。
[解决办法]
这个,要是我应试的话也不定一下做出来,如果是招二年内毕业的,这题应该不难。我平时只有用的时候才去想这个,用什么样的算法与具体业务需求相关,有时写出来了,反道叫不出算法的名称,就我多年的经验,一个真的程序中,大多时是混合算法多些,平时我给别人提供框架和基础架构时,基本不想用什么算法,用什么设计模式,一切服务于业务,安全、运行环境下的要求的效率。
要真招个人,出个简单的业务,上机,给他一个大的技术范围要求,然后就随便他用什么方法做出来,再评分更好些
[解决办法]
我也这么觉得,“例:你要招的人是1000块的”你按3000块的标准去找人..能找到人也才怪,即使找到了,人家愿意给你干3000块钱的活?
[解决办法]
你们公司让一个技术人员去负责招聘?我觉得不大合适
招聘起码要做到的是明码标价,比如,你的最低月薪是3k(保险福利另算),那么最高工资就是6倍(18K)
这样的话,招人的时候,你们只招聘最初级的,门槛越低越好,
中高级完全靠自己培养,晋升
人力资源选人的条件主要是看基本素质,比如待人接物的风格和学校的学习态度,还有一些基本的技术能力
这些从简历上就可以考出来,
那些投简历的人,自己简历上吹嘘的是什么,我们就调查他什么
至于上岗资格,放在培训阶段解决,通过测试的,就可以上岗,
还有一点,小微企业尤其要自己培养人才,要舍得在人力资源建设上投入,要舍得在生产工具研发上投入
[解决办法]
人力资源总体趋势是:
个人能力将越来越弱,(软件)生产将越来越依赖团队能力
如果你们企业招人很难的话,那就意味着:
你不能用的人,别人一定能用;
如果你们企业人员离职频繁的话,那就意味着:
你用不好的人,别人一定能用好
如果情况刚好相反的话,那就意味着:
你们企业在人力资源的竞争中拥有优势地位
[解决办法]
我觉得楼主考这个问题没有什么过错啊,面试毕竟时间很短,如果是计算机系的,考一点基础的代码编写是很常见的。这个题目本身并不涉及到太多语言的东西,同样的题目可以用很多语言来写。我们公司一般在面试的时候,只会提一个问题,然后让面试的人自己选择用什么语言来实现。如果是楼主这个题目,在我看来,我只是想看看面试者基本的coding skill。对语言的熟悉,对各种平台的API的熟悉这个来自学习和经验,做做就会有了,但是不管你做什么产品,熟悉多少API,你必须得有一个解决问题的思路,你才能灵活运用这些设计好的API,事半功倍。所以考察基本的编程技巧很好,而且这个题目写完最简单的版本,基本就是一个个顺序的比较Name,还可以考虑让面试者想想优化的方法,比如,插入时对Name按照一个顺序来插入到特定的位置,那么比较有没有重复的时候就会快很多。等等,基本面试时间那么短,考虑解决问题的思路最重要,语言平台那是可以慢慢弥补的
[解决办法]
牛逼公司必做,而且还都是手写,google、微软那种就算有很好的思路写不出来一样白搭。。。