上午去科技园面试.Net程序员,趁现在还没有忘记和大家分享面试的经历。到公司后前台MM给了一份面试题,我能够记住的题目大致是这样:
1、用C# StringBuild 类实现1到10000的整数拼接,数与数之间用逗号分隔,例如1,2,3,...。
2、用Java 构造一个int类型的队列,生成10000个1(含)到100(含)之间的整数,然后插入到队列中。
3、用C/C++实现N(N是常数)个int类型的内存空间,然后释放它,这块内存空间是连续的吗?
4、用C++/C#/Java(选一种)代码实现OOP(Oriented-Object Programming)中的多态。
5、用T-SQL创建一张只包含一个int类型字段的表,将1到10000插入到表中,然后对这个字段的所有行求和。
6、写出C#代码的输出:
Console.WriteLine(32.ToString("F01"));
Console.WriteLine(32.ToString("X"));
7、写出Java代码的输出:
System.out.println(Math.round(10.5));
System.out.println(Math.round(-10.5));
System.out.println(Math.round(5 & 10));
8、如下C代码中foo函数有什么作用?这段代码有什么缺陷?
int foo(const char* p)
{
const char* q = p;
while (*p != ' ' && *p != '0')
p++;
return (*p != ' ') ? -1 : (p -q);
}
9、用你熟悉的语言实现字符串反转,不能使用语言自身提供的工具函数。
10、递归实现费波拉契数列的第N项。
做题大概用了一个小时左右吧,这里有一个细节需要注意的是进入公司后要把手机静音或者关机。面试官看了我的答题说做的不错,然后开始问其他问题,我按照时间先后来说。
1、简单介绍下自己。
我主要是从项目经历来回答的,具体是这三个方面:
a) 项目的业务流程。
b) 项目使用的基本技术、工具。
c) 开发项目的团队规模和自己在项目中的职责。
我简历上写的是有两年工作经验,分别在两个公司待过,每个公司工作的时间都是整整一年。
2 问我为什么要离开第一个公司?
第一个公司是用VB做开发,我不喜欢所以就直说了。
3 问我为什么要离开第二个公司?
两份工作都是C/S结构开发的,现在想做B/S结构开发。
这里需要注意的是不管什么原因离职,最好不好说一些敏感的原因。另外,频繁跳槽会让面试官觉得求职者不踏实,面试官看到我两年跳槽两次,担心我在公司待上一年会离开,所以在简历上几年之内出现很多份工作是不可取的,可以灵活处理下。
聊了一会聊到处理大数据和数据库优化上,由于我在处理大数据上没有什么经验可以提供,我只回答了优化数据库的一般思路,这里需要说明的是如果自己没有某方面(如处理大数据)的经验就如实谦虚的回答,如果你感兴趣可以问下面试官。
4 数据库优化的一般思路,(如有不对的地方劳烦大家指出)
a) 物理I/O
b) 编译时间
c) 执行计划
b) 表设计
d) 语句级别
目前我对数据库的优化认识很肤浅,只能从我所知道的方面来回答了,如果大家有兴趣可以看徐海蔚写的书。
和面试官大概聊了一个小时,问我期待的薪水,可以从自己目前的薪水和行业的薪水标准给出一个大概的范围。这里提醒大家的是在谈薪水的时候最好是给一个范围。
5 期待的薪水是多少?
根据自己目前的薪水和深圳软件行业两年工作经验的薪酬平均水平,我期待的月薪是XXXX到YYYY。最后面试官问我有没什么要问的,我问的是自己会负责哪方面的工作。
下午回来收到面试通过的邮件了,靠谱的公司会把薪资和各项福利待遇以邮件的方式来通知面试者。
下面是题目的答案思路,仅供参考。
1、用C# StringBuild 类实现1到10000的整数拼接,数与数之间用逗号分隔,例如1,2,3,...。
using System.IO; using System; using System.Text; class Program { static void Main() { StringBuilder sb = new StringBuilder(); int i = 1; for (i = 1; i < 10000; i++) { sb.Append(i.ToString() + ","); } sb.AppendLine(i.ToString()); Console.WriteLine(sb.ToString()); } }
2 用Java 构造一个int类型的队列,生成10000个1(含)到100(含)之间的整数,然后插入到队列中。
import java.util.Queue; import java.util.concurrent.LinkedBlockingQueue; public class HelloWorld{ public static void main(String []args){ Queue<Integer> q = new LinkedBlockingQueue<Integer>(); for (Integer i = 1; i <= 10000; i++) { q.offer((int)(Math.random() * 100 + 1)); } for(Integer x : q) { System.out.println(x); } } }
3、用C/C++实现N(N是常数)个int类型的内存空间,然后释放它,这块内存空间是连续的吗?
#include <stdio.h> #include <stdlib.h> #define N 10 int main() { int* p = malloc(sizeof(int) * N); printf("use the memory ... "); free(p); return 0; }
一般是连续的,但是编译器不能保证向操作系统申请的空间一定是连续的。
4、用C++/C#/Java(选一种)代码实现OOP(Oriented-Object Programming)中的多态。
多态可以从覆盖和重载两个方面来考虑,我是从覆盖的角度实现的。
using System.IO; using System; namespace myNameSpace { public class Animal { public virtual void Jiao() { } } public class Dog : Animal { public override void Jiao() { Console.WriteLine("bark..."); } } public class Cat : Animal { public override void Jiao() { Console.WriteLine("meow..."); } } class Program { static void Main() { Dog g = new Dog(); g.Jiao(); Cat c = new Cat(); c.Jiao(); } } }
5、用T-SQL创建一张只包含一个int类型字段的表,将1到10000插入到表中,然后对这个字段的所有行求和。
CREATE TABLE t1 ( i INT PRIMARY KEY NOT NULL ) DECLARE @i int SET @i = 1 WHILE(@i <= 10000) BEGIN INSERT INTO t1(i) VALUES(@i) SET @i = @i + 1 END ;WITH cte AS ( SELECT i,'1' 'GroupingCondition' FROM t1 ) SELECT SUM(i) 'sum' FROM cte GROUP BY GroupingCondition
6、写出C#代码的输出:
Console.WriteLine(32.ToString("F01"));
Console.WriteLine(32.ToString("X"));
关于C#中ToString()方法可以参考这篇博客:http://www.cnblogs.com/jacktu/archive/2007/11/30/978293.html
7、写出Java代码的输出:
System.out.println(Math.round(10.5));
System.out.println(Math.round(-10.5));
System.out.println(Math.round(5 & 10));
round(n):对n进行四舍五入,其算法等价于 n+0.5后向下取整。
8、如下C代码中foo函数有什么作用?这段代码有什么缺陷?
int foo(const char* p)
{
const char* q = p;
while (*p != ' ' && *p != '0')
p++;
return (*p != ' ') ? -1 : (p -q);
}
作用: 当p指向的字符串包含字符'0'时,返回-1,否则返回p指向字符串的字节数(长度)。
缺陷: 指向常量的指针p的地址被改变了,如果需要使用p指向的内容,那么p指向的内容是NULL。(这里有几个概念需要区分:指向常量的指针,常指针,指向常量的常指针)
9、用你熟悉的语言实现字符串反转,不能使用语言自身提供的工具函数。
我处理的思路是:使用头尾指针交换,T(N) = O(N)
10、递归实现费波拉契数列的第N项。
通过解齐次方程求递归的时间复杂度,T(N)=O(((1+√5)/2 )^N),几年没看线性代数了,这题解错了。