昨天去了慕名已久的Dell面试(Dell自2015年退出了世界500强的评比),一面基本合格,二面基本没答上。。。

  对公司的整体印象非常好(每个人桌上都有两台很大的显示器;9:00-15:30,如果能完成任务还不需要严格遵守作息时间;茶水间有微波炉、烤箱、冰箱等)。下面简单记录下招聘会流程。

招聘会流程:

  调查问卷:几道选择题,包括应聘职位、意向部门、获取Dell招聘信的渠道等。

  笔试:全英文共40分钟,主要靠基本功。题型和分值如下:

      单选题5'*5,

      写输出结果(当天考的线程await和async),

      编程题40‘:用Array实现Stack,用到设计模式有额外加分(此题的关键是用泛型T实现一个Node类,类中包含一个T字段,指向上一个节点的引用和指向下一个节点的引用)

      算法题30’:一个含99个元素的int数组,数组元素值范围是1-100中不重复的数,要求写出查找缺失元素的最优时间复杂度算法和最优空间复杂度的算法。~~o(>_<)o ~~,没有复习这一块,加上毕业这么久,数据结构和算法全还给老师了,写了个错的答案,回头复习下再补充。

   一面:一面是资深员工面试。一般问些很基础的问题,如:值类型和应用类型的区别和应用场景,C#从SQL Server读取数据的流程,实体框架,SQL的join和union,设计模式等。

  二面:二面师部门Leader面试,先要求做自我介绍(PS:面试官很忙,以致于简历他只会扫一眼,所以一些简历上的内容需要口述一遍);然后是介绍一个自己参与比较多的项目,介绍自己的工作,面试官会从项目的核心技术点出发提问,主要有微软的测试工具、数据库优化工具、分布式、多线程,我基本答不上来,面试官还是都指点了一下。完了,说映像不错,让等(wei)通(tong)知(guo)。

  C#实现栈和队列,原文地址:http://www.cnblogs.com/mycom/archive/2013/03/24/Csharpcustomstackandqueue.html

C#实现简单的栈和队列

C#提供了栈和队列,我们自己也可以尝试简单实现。
而且这可以作为一个很好的面试题,主要考察c#基础、类的设计以及数据结构。根据不同的职位需求可以考察选择不同的考察难度和角度。4年前我第一次参加面试并进现在的公司,职位基本是公司的最低岗位了。当时面的题目就是:实现一个栈。

简单的实现如下(考虑到顺序结构实现队列比较麻烦,采用链式结构):
PS:感谢@LoveZmJ的提醒,下面的代码有个bug,对Test有兴趣的人可以先不要看评论,玩玩“大家来找茬”~~

首先是结点类的实现:

// 结点类
// 注意应该使用泛型
public class MyNode<T>
{
// 存储的数据
public T Data
{
get { return _data; }
set { _data = value; }
}

// 指向下一个结点
public MyNode<T> next { get { return _next; } set { _next = value; } }

//构造函数,不提供无参版本
public MyNode(T data)
{
_data = data;
_next = null;
}

// 私有字段
private T _data;
private MyNode<T> _next;
}

然后抽象一个简单的父类:

// 为栈和队列提取一些通用的成员,抽象出一个父类,此处用接口还是抽象函数?
// 在C#中Stack和Queue继承自两个接口:IEnumerable<T>, ICollection
// 但是作为简单的实现(特别是作为面试题答案),还是写成抽象类比较好,原因有二:
// 1. 可以在抽象类中实现一些通用方法,子类只需要继承就可以直接用,可以简化代码
// 2. 抽象出来的父类,和子类Stack、Queue可以看做“is-a”的关系。
// 当然也可以是非抽象的普通类,但是处于“不能实例化”的考虑,应该是抽象的
// 注意使用泛型
public abstract class AbstactList<T>
{
// 头结点,其后才是第一个结点
// 注意应该是protected,对外是不可见的
protected MyNode<T> Header { get; set; }
// 尾结点,即是最后一个结点
protected MyNode<T> Tail { get; set; }
// 当前结点个数,注意是只读属性
public int NoteCount { get { return _noteCount; } }

// 构造函数,初始化头结点和结点个数
public AbstactList()
{
// 注意此处default(T)的使用
Header = new MyNode<T>(default(T));
Tail = Header;
_noteCount = 0;
}

// “出的操作”,对于栈和队列都是一样的,所以可以写在父类里
// 注意应该从“头”端出,时间复杂度为O(1)
// 如果从“尾”端出,则会造成时间复杂度为O(n)
protected T Out()
{
// 注意判空,只要一个条件就可以了,将所有的条件都写在这里可以有利于在测试的时候检测出bug
if (Header.next == null && _noteCount == 0 && NoteCount == 0 && IsEmpty())
{
throw new InvalidOperationException("Is empty!");
}

MyNode<T> outNode = Header.next;
Header.next = Header.next.next;
_noteCount--;
return outNode.Data;
}

// 判空
public bool IsEmpty()
{
return _noteCount == 0 ? true : false;
}

// 对于“出”的操作,栈和队列是有区别的,所以申明成抽象方法
// 到子类中去具体实现
protected abstract void In(T NodeData);

// 子类中还要用到,所以是Protected
protected int _noteCount;
}

栈的具体实现:

// 栈的实现,继承自抽象类
public class MyStack<T> : AbstactList<T>
{
// 实现“进”的方法,在“头”端
// 由于实现抽象类方法的当前方法默认是虚的,所以无法设为private
protected override void In(T NodeData)
{
MyNode<T> Node = new MyNode<T>(NodeData);
Node.next = Header.next;
Header.next = Node;
_noteCount++;
}

// 进栈,只是将操作改个名字
public void Push(T NodeData)
{
In(NodeData);
}

// 出栈,只是将操作改个名字
public T Pop()
{
return Out();
}
}

队列的实现:

// 队列的实现,继承自抽象类
public class MyQueue<T> : AbstactList<T>
{
// 实现“进”的方法,在“尾”端
// 由于实现抽象类方法的当前方法默认是虚的,所以无法设为private
protected override void In(T NodeNode)
{
MyNode<T> Node = new MyNode<T>(NodeNode);
Tail.next = Node;
Tail = Node;
_noteCount++;
}

public void EnQue(T NodeData)
{
In(NodeData);
}

public T DeQue()
{
return Out();
}
}

单元测试:

对栈和队列的单元测试
[TestClass]
public class UnitTest1
{
[TestMethod]
public void StackTest()
{
MyStack<char> charStack = new MyStack<char>();
Assert.IsTrue(charStack.IsEmpty());
charStack.Push('a');
Assert.IsFalse(charStack.IsEmpty());
charStack.Push('b');
Assert.AreEqual(charStack.Pop(), 'b');
charStack.Push('c');
Assert.AreEqual(charStack.NoteCount,2);
Assert.AreEqual(charStack.Pop(), 'c');
Assert.AreEqual(charStack.Pop(), 'a');
Assert.IsTrue(charStack.IsEmpty());

try
{
charStack.Pop();
}
catch (Exception ex)
{
Assert.IsInstanceOfType(ex,typeof(InvalidOperationException));
}
}

[TestMethod]
public void QueueTest()
{
MyQueue<int> intQueue = new MyQueue<int>();
Assert.IsTrue(intQueue.IsEmpty());
intQueue.EnQue(1);
intQueue.EnQue(2);
Assert.AreEqual(intQueue.DeQue(), 1);
intQueue.EnQue(3);
Assert.AreEqual(intQueue.NoteCount,2);
Assert.AreEqual(intQueue.DeQue(), 2);
Assert.AreEqual(intQueue.DeQue(), 3);
Assert.IsTrue(intQueue.IsEmpty());

try
{
intQueue.DeQue();
}
catch (Exception ex)
{
Assert.IsInstanceOfType(ex, typeof(InvalidOperationException));
}
}
}

【面试】D的更多相关文章

  1. C++常见笔试面试要点以及常见问题

    1. C++常见笔试面试要点: C++语言相关: (1) 虚函数(多态)的内部实现 (2) 智能指针用过哪些?shared_ptr和unique_ptr用的时候需要注意什么?shared_ptr的实现 ...

  2. [Java面经] 关于面试的二三事.

    今天终于闲下来了, 那么也好总结下这几天面试的经历.四天的时间一共面了七家, 有一家是自己推迟了没有去.声明:如若转载请注明出处:http://www.cnblogs.com/wang-meng/p/ ...

  3. 在面试中忽然发现DateTime的一些...

    今天说说我面试中碰到的一个小问题,在我问起DateTime为什么无法赋值NULL值,一般第一反应都认为它是值类型,不是引用类型,但随后我查阅了度娘自我学习到它是结构类型,那么随之而然就无法赋值NULL ...

  4. 2016年8月ios面试问题总结

    1.app分发方式 所谓分发方式简单点讲就是你的app都可以通过哪些途径给用户使用. a:个人或者公司的开发者账号 可以上传appStore,用户通过appStore下载. b:企业账号:打包分发. ...

  5. 记2016腾讯 TST 校招面试经历,电面、笔试写代码、技术面、hr面,共5轮

    (出处:http://www.cnblogs.com/linguanh/) 前序: 距离  2016 腾讯 TST 校招面试结束已经5天了,3月27日至今,目前还在等待消息.从投简历到两轮电面,再到被 ...

  6. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  7. Android面试经验 -- 乐视

    此次投的是三年经验的Android开发,最后反而因为自己的失误,没有准备充分而导致结果很悲剧,以此告诫自己千万不能疏忽大意. 面试过程 第一次去大公司面试,心里不是一般的激动和紧张,来到乐视大厦门口, ...

  8. Android面试一天一题(1Day)

    写在前面 该博客思路源于在简书看到goeasyway博主写的Android面试一天一题系列,无copy之意,仅为让自己总结知识点,成长一点点.先感谢各位大神的无私分享~! 关于题目,大部分则出自And ...

  9. Java面试基础概念总结

    面向对象软件开发的优点有哪些? 答:开发模块化,更易维护和修改:代码之间可以复用:增强代码的可靠性.灵活性和可理解性. 多态的定义? 答:多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力. ...

  10. 【干货分享】前端面试知识点锦集04(Others篇)——附答案

    四.Others部分 技术类 1.http状态码有哪些?分别代表是什么意思? (1).成功2×× 成功处理了请求的状态码.200 服务器已成功处理了请求并提供了请求的网页.204 服务器成功处理了请求 ...

随机推荐

  1. python----模块知识拓展

    1.hashlib ------configpraser-------- xml hashlib 模块导入:import hashlib 模块说明:用于将信息加密,明文变成密文 功能说明 MD5算法 ...

  2. neutron之SDN简单测试

    title: Neutron SDN 手动实现手册 date: 2017-04-13 23:37 tags: Network 本文旨在通过自己搭建类似neutron (openvswitch + gr ...

  3. 常见GAN的应用

    深入浅出 GAN·原理篇文字版(完整)|干货 from:http://baijiahao.baidu.com/s?id=1568663805038898&wfr=spider&for= ...

  4. ubuntu下安装交叉编译工具链

    /usr/localmkdir arm 将文件file1复制成文件file2 cp file1 file2 /cp /mnt/hgfs/UbuntuGX/arm-2008q3-linux.tar.gz ...

  5. cocos2dx lua 热加载实现

    [Q]原创 2015-08-30 在公司使用cocos2dx+lua 开发游戏有一段时间了,刚好lua的热更新交给我负责.以前热更新的lua脚本大部分都是在下载之后加载.最近策划又有新需求,需要在游戏 ...

  6. NTP服务器和国内可用的NTP地址

    NTP 是什么?   NTP 是网络时间协议(Network Time Protocol),它用来同步网络设备[如计算机.手机]的时间的协议. NTP 实现什么目的?   目的很简单,就是为了提供准确 ...

  7. Lua基础---lua字符串库函数详解,实例及正则表达式

    参考这个网友写的,比较简单容易理解. http://blog.csdn.net/wlgy123/article/details/49206183

  8. Asyphre for Delphi Xe4 Demo Running on iPad!

    Asyphre 4.0 . customize bitmap with asvf file.  compiled done!  check the video!

  9. vim自动打开跳到上次的光标位置

    只需要vimrc里面加一个稍微复杂一点的autocmd就搞定了: if has("autocmd") au BufReadPost * && line(" ...

  10. linux下json库的编译及例程

    .下载JsonCpp http://sourceforge.net/projects/jsoncpp/files/ .下载scons http://sourceforge.net/projects/s ...