小弱石的求职季笔记(三,完结)

offer来的如此突然。

前两天重振旗鼓,开始跑各种宣讲,什么地产的、医药的,信息管理岗什么的,看见在广州深圳的就打算过去投......当时就想着只要录用我就去了......

先是面了广州医药,说要等他们回到广州再安排专业电话面试,要11月中旬......那就等着吧。然后继续参加宣讲,就参加到了深圳天珑的宣讲,感觉还挺不错,福利和成长性都挺何意,就参加了笔试。


六、深圳天珑,软件工程师(已签三方)

笔试当天半夜12点左右发了面试通知......第二天早上10点赶紧跑去面试。

一面是技术面,先问了一下做的项目,就照着自己的思路大概讲了讲。然后就开始问笔试题,主要是问笔试时候做错的一些题......


1. 个人比较不清楚的问题就是,C语言中变量的声明和定义有什么区别

变量的声明有两种情况

a. 需要建立存储空间的。比如在声明 int a 的时候,已经建立了a的存储空间;

b. 不需要建立存储空间的。比如声明外部变量 extern int a 只是把外部的变量进行一次声明,不需建立存储空间。

对于这两种情况,前者是“定义性声明”,也就是所说的”定义“。后者是”引用性声明“。

广义上说,显然声明包含了定义定义即为声明的一个特例

例子: int a 既是声明又是定义,而 extern int a 仅仅是声明。

一般把建立空间的声明称为”定义“,而不需要建立空间的称为“声明”。

Note:声明的最终目的是为了在定义之前就可以使用它,如果不需要提前使用就没有单独声明的必要,变量和函数都是如此。所以声明不会分配存储空间,而定义时才会分配存储空间。


2. 还有一个关于Java的问题(面试时没问,笔试没答完整,觉得需要记录),Java中有自动回收机制但还是有可能出现内存泄露问题,为什么?如何防范?

a. 原因:在Java程序运行时,垃圾回收器GC会不定时地被唤起,检查是否有不再使用的对象,并释放他们所占用的空间。其回收无规律可循可能在程序的运行过程中,也可能一次都没有启动,还可能启动了很多次。因此很有可能出现这种情况,就是直到程序结束,GC都未启动,所以GC并不能完全避免内存泄露问题

b. 防范:

(1)尽量减少使用匿名对象,慎用内部类。因为匿名对象被使用完后就变成垃圾,而在内部类中,隐含一个外部类对象引用,这个引用也无法自动消除;

(2)在使用System.gc()的程序中,尽量少用finalize()方法。因为System.gc()方法在回收每一个对象所占内存空间时,都会调用finalize()方法,在这个方法中的任何操作都会增加垃圾回收开销;

(3)慎用System.gc()方法,减少线程个数。在程序中显式调用该方法不能保证清除所有方法,它只是一个“建议”。并且垃圾回收也是一个单独线程,会消耗系统资源,同时启动GC可能会造成间歇性停顿。而线程越多,GC线程挂起和恢复的可能性就越大,花费时间越长,系统开销越大。

以上是笔试题的回答,参照了别人的技术博客的内容,如果要更清楚地了解可以到这:http://blog.sina.com.cn/s/blog_538b279a0100098d.html 《Java中内存泄露及垃圾回收机制》,写得很好,值得学习。


3. 然后就是几个排序算法,冒泡、选择、插入排序,笔试时候没写对选择和插入,不过面试时候跟面试官详细讲解了算法流程,解释了一下因为没怎么在编程时候用到所以手写起来有些细节问题......

a. 冒泡排序,看这名字就知道,是每次把小的(或大的)值往面前转移,实测代码:

int* bubbleSort(int data[], int len)
{ //冒泡排序,O(n^2)
    int temp;
    for(int i = 0; i < len; i++)
    {
        for(int j = len - 1; j > i; j--)
        { //注意此处从len - 1 处开始,向前检查相邻数据,把小的数据往前移动
            if(data[j] < data[j - 1])
            {
                temp = data[j - 1];
                data[j - 1] = data[j];
                data[j] = temp;
            }
        }
    }

    return data;
}

b. 选择排序,主要思想就是第 i 趟找出未排序部分的最小(最大)值,与第 i 位置的数据进行交换,于是第 i 个位置上放着第 i 小(大)的数据,结果自然就有序了:

int* selectSort(int data[], int len)
{ //选择排序,O(n^2)
    int temp = 0;
    int index = 0; //记录下标
    for(int i = 0; i < len; i++)
    {
        temp = data[i];
        index = i;

        for(int j = i + 1; j < len; j++)
        { //每次从排好序的后一个位置开始扫描,记录出最小的数值的下标
            if(data[j] < temp)
            {
                temp = data[j];
                index = j;
            }
        }

        if(index != i)
        { //将本次循环中最小的数与位置i的数进行替换,即为第i小的数
            data[index] = data[i];
            data[i] = temp;
        }
    }

    return data;
}

c. 插入排序,当时直接用了新的空间来保存结果,于是有可能每次都要把结果数组的插入位置后的数据后移,复杂度飞到O(n^3)都没注意。这个排序的主要思想就是假定位置 i 的前面的数据是已经排好序的,对于第 i 位的数据,向前逐步移动到比它小(或大)的数据后面,这样每次加入的数据都放在了合适的位置上,最终结果自然也就是有序的了:

int* insertSort(int data[], int len)
{ //插入排序,O(n^2)
    for(int i = 1; i < len; i++)
    { //假设i位置之前的数据是已经排好序的
      //只要每次将i向前转移到合适的位置即可
        int temp = data[i];
        int j = i;

        if(data[j - 1] > temp)
        {
            while(j >= 1 && data[j - 1] > temp)
            { //i向前移动,到比它小的数据后
                data[j] = data[j - 1];
                j--;
            }
        }
        data[j] = temp;
    }

    return data;
}

比较重点的也就这些了,一面完就让我在外面等了几分钟,过了会出来说稍后就HR面......

HR面基本上也就是基本情况、未来发展方向、期望月薪等等了,当时就根据自己现在技术方面还比较薄弱的情况,说了个期望8k吧,还感觉可能会他们开更低......然而最终开出的还更高了......奖金方面也比较丰厚,不过开始的一年半其实算是培养期,大概是一年14薪这样,培养结束后就开始比绩效了,一年至少是16薪(还有18薪、20薪等等),升职加薪也是培养结束后考虑。

跟来招聘的HR和技术部门的上司接触了一些,感觉整体氛围都不错,而且网上也没有什么负面说法。月薪也算符合了期望,公司地理位置也挺好福利政策也比较齐全了,然后据说老板也比较乐于分享,发奖不会小气......那我基本上就放心了。


于是面试完当天晚上,又是12点左右......收到了短信offer......于是第二天,也就是今早,跑去酒店把三方签了。

就这样突如其来的卖身,结束了我的求职季,也算是一个不错的结局吧hhh~


接下来就赶紧多读paper,把毕设搞定,然后去做点项目,锻炼实战经验咯。

之后的目标很简单:从弱鸡变成大牛!奋斗

posted @ 2016-11-05 13:19  StoneDemo  阅读(204)  评论(0编辑  收藏  举报