【面试】D
昨天去了慕名已久的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的更多相关文章
- C++常见笔试面试要点以及常见问题
1. C++常见笔试面试要点: C++语言相关: (1) 虚函数(多态)的内部实现 (2) 智能指针用过哪些?shared_ptr和unique_ptr用的时候需要注意什么?shared_ptr的实现 ...
- [Java面经] 关于面试的二三事.
今天终于闲下来了, 那么也好总结下这几天面试的经历.四天的时间一共面了七家, 有一家是自己推迟了没有去.声明:如若转载请注明出处:http://www.cnblogs.com/wang-meng/p/ ...
- 在面试中忽然发现DateTime的一些...
今天说说我面试中碰到的一个小问题,在我问起DateTime为什么无法赋值NULL值,一般第一反应都认为它是值类型,不是引用类型,但随后我查阅了度娘自我学习到它是结构类型,那么随之而然就无法赋值NULL ...
- 2016年8月ios面试问题总结
1.app分发方式 所谓分发方式简单点讲就是你的app都可以通过哪些途径给用户使用. a:个人或者公司的开发者账号 可以上传appStore,用户通过appStore下载. b:企业账号:打包分发. ...
- 记2016腾讯 TST 校招面试经历,电面、笔试写代码、技术面、hr面,共5轮
(出处:http://www.cnblogs.com/linguanh/) 前序: 距离 2016 腾讯 TST 校招面试结束已经5天了,3月27日至今,目前还在等待消息.从投简历到两轮电面,再到被 ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- Android面试经验 -- 乐视
此次投的是三年经验的Android开发,最后反而因为自己的失误,没有准备充分而导致结果很悲剧,以此告诫自己千万不能疏忽大意. 面试过程 第一次去大公司面试,心里不是一般的激动和紧张,来到乐视大厦门口, ...
- Android面试一天一题(1Day)
写在前面 该博客思路源于在简书看到goeasyway博主写的Android面试一天一题系列,无copy之意,仅为让自己总结知识点,成长一点点.先感谢各位大神的无私分享~! 关于题目,大部分则出自And ...
- Java面试基础概念总结
面向对象软件开发的优点有哪些? 答:开发模块化,更易维护和修改:代码之间可以复用:增强代码的可靠性.灵活性和可理解性. 多态的定义? 答:多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力. ...
- 【干货分享】前端面试知识点锦集04(Others篇)——附答案
四.Others部分 技术类 1.http状态码有哪些?分别代表是什么意思? (1).成功2×× 成功处理了请求的状态码.200 服务器已成功处理了请求并提供了请求的网页.204 服务器成功处理了请求 ...
随机推荐
- 【lightoj-1094】树的直径(DFS)
链接:http://www.lightoj.com/volume_showproblem.php?problem=1094 题意: 一共n各节点编号0-n-1, 输入n-1条无向边代表u-v距离为w, ...
- 初识Linux(三)--文件系统基本结构
Linux文件系统是一个倒立的单根树状结构,文件名称严格区分大小写(windows系统则是对大小写不明感的).路径用“/”分隔,跟windows的“\”不同. 这里我画了一张一般Linux系统的正常目 ...
- oracle 存储过程心得2
1.退出存储过程 return if old_save_time = new_save_time then--没有最新数据,退出 insert into hy_data_handle_mark(id, ...
- MyEclipse Tern was unable to complete your request in time
1.错误描述 2.错误原因 由错误提示可知,是由于MyEclipse Tern不能及时完成回复 3.解决办法 (1)Window--->Preferences--->MyEclipse-- ...
- Tinker爬坑之路
目的 热修复去年年底出的时候,变成了今年最火的技术之一.依旧记得去年面试的时候统一的MVP,然而今年却变成了RN,热修复.这不得不导致我们需要随时掌握最新的技术.不然可能随时会被淘汰.记得刚进公司,技 ...
- java网络编程TCP传输—流操作—拿到源后的写入动作
在网络编程中的TCP传输里,拿到Socket的源后,应该怎么进行读写操作呢,下面我列举了两种方法,希望大家帮忙补充···· 1.利用byte数组作为一个缓冲区进行读写 客户端上传 //获取socket ...
- Cisco DHCP 配置要点
实验拓扑图:IOU5/6/7模拟主机 IOU1为DHCP服务器 IOU2为DHCP中继器 IOU3/4为局域网内的交换机 在IOU1中配置DHCP配置 IOU2作为DHCP中继,在E0/0.10和E0 ...
- Python 调用C函数
/******************************************************************** * Python 调用C函数 * 说明: * Tony在处理 ...
- RedHat Server Enterprise 6安装G++
RedHat 6默认是安装有GCC,而没有安装G++编译 要安装G++前最好先查看下GCC的版本号,通常GCC的版本和G++的版本是相同的,知道GCC的版本再去找G++的安装文件就容易些,版本号有在安 ...
- php 设计数据库连接池
摘要 之前总是以脚本面向过程的方式写PHP代码,所以很大程度上来说,既不规范,也不安全,更不容易维护.为了代码的重用,准备写一套自己的工具库,这样的话,以后写项目的时候就可以很轻松的进行使用啦. 今天 ...