随笔-341  评论-2670  文章-0  trackbacks-0
    今天经营着世界最大的搜索业务的某公司在位于广州市海珠区珠江河畔的某著名大学开了一次招聘会,申请实习软件工程师的都要笔试。于是我也去写了,虽然我不是位于广州市海珠区珠江河畔的某著名大学的学生,反正人人都能去。

    第一道题,把字符串中相连的重复字符处理成一个。例如aaabbcddcc处理成abcdc。因为寒假的时候才往Vczh Free Script 2.0中添加了一个Mark-Compact Collector,因此算法也就模仿了一下Mark-Compact Collector,也就是把所有该删掉的字符换成'\0',依次读取并跟右边最近的非'\0'字符置换一直到完。

    第二道题,已知数列中有1、2、3三种数字,并且可以两两置换。求最小置换次数的方法让数列递增。

    我用了这样的方法:
    ·找到并保存每一个位置中应该存放的数字,也就是一1、2、3的数目都跟数列相同的递增数列bi。
    ·遍历ai,找到ai≠bi的i并做如下处理:
        ·寻找aj使得j>i且bi=aj且bi≠bj
        ·在这些j中寻找k使得bk=ai
        ·如果k非空则让m∈k,否则让m∈j并让下一步的k的势最大
        ·置换ai和am

    一个好像很和谐但是事实上不知道和谐不和谐的证明:
        j>i且bi=aj且bi≠bj这个条件是必定满足的。如果不满足,则很容易证明ai和bi中1、2、3的数目不完全相同。
        k非空使得一次置换产生了两个正确的结果。
        对于每一次置换,如果让m1∈j且{m1}∩k为空,m2∈k,则有
            选择m1而不是m2有可能减少、保持或增大下一次置换中k的势;
            选择m2则下一次置换中k的势不变。
        这样的话,选择m1最好的结果就是让这次置换不影响全部的置换,最坏的结果是增加了置换的次数;
        选择m2则不会影响全部的置换。
        因此只需每一次都尽量选择m2中的值,对于k∩j为空的情况,则计算所有j得到的下一步的k的势dj,选择最大的j即可。

    第三道题,华容道解谜器。只好弄了个宽度优先搜索。

    以上纯属YY。

    P.S.
    ·选择题里面有一道问ABCDEFGHIJ的全排列中满足A在B前面的数量有多少?答案:因为A和B是对称的,因此对于任意一个确定的A和B的位置的集合,A在B前的概率是0.5,因此答案为10!/2。

    ·同时拥有操作系统、开发工具、数据库引擎、办公软件、游戏平台等多项业务的某著名软件公司的招聘活动我也参加了一次,结果发现经营着世界最大的搜索业务的某公司和同时拥有操作系统、开发工具、数据库引擎、办公软件、游戏平台等多项业务的某著名软件公司【好像】有一个特点。经营着世界最大的搜索业务的某公司喜欢出最优解题目,同时拥有操作系统、开发工具、数据库引擎、办公软件、游戏平台等多项业务的某著名软件公司喜欢出最高速题目。而且经营着世界最大的搜索业务的某公司很喜欢去在位于广州市海珠区珠江河畔的某著名大学,而同时拥有操作系统、开发工具、数据库引擎、办公软件、游戏平台等多项业务的某著名软件公司则很喜欢去位于广州市五山的某著名理工大学。
posted on 2008-05-12 10:59 陈梓瀚(vczh) 阅读(2415) 评论(0)  编辑 收藏 引用 所属分类: C++