面试经历(一)

上午去科技园面试.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 != '\0' && *p != '0')

          p++;

   return  (*p != '\0') ? -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 ...\n");

    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 != '\0' && *p != '0')

          p++;

   return  (*p != '\0') ? -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),几年没看线性代数了,这题解错了。

posted @ 2015-03-09 22:59  freecodeX  阅读(271)  评论(0编辑  收藏  举报