【面试题】2013年小米面试试题【转】

来源:互联网 发布:Ubuntu进程的创建命令 编辑:程序博客网 时间:2024/06/02 11:56

2013年小米面试试题【转】

原文地址:http://user.qzone.qq.com/497692938/blog/1347967750 

    今天刚参加完小米科技的求职面试,发现面试有很多影响发挥的因素。其中,最大的影响因素就是心理,以平静的心理进行面试会有更高有成功率。今天面试失败的原因就是心理不稳定,过于的紧张了。还有就是面试时,面试官将当场用手写程序。以前总是在电脑前敲程序,用手写很不适应。下面给大家分享一下面试试题:(c++版) 

一面

    1.一个由多个英文单词和多个空格组成的字符串,将它以英文单词为单位颠倒字符串顺序(英文单词内的字符间顺序不用颠倒)。

       2.现在有n个小括号对(括号对是指‘(’和‘)’),输出所有合法的括号排列顺序。如,(()())、((()))是合法括号序列,此时n=3。

二面

    3.一个map中存有类似如下的数据:

    key            value

    "a"                "afasfwaeqwfwa(b)eqwgewgrqgq"

    "b"                "frgwegqgg(c)fqf(d)dqf"

    "c"                "fqfgrfwgrw"

    "d"                "gwrgwergqwg"

    现在写一个函数,将"b"的value中的“(c)”和“(d)”分别用"c”和"d"的value替换,然后将"a"的value中的“(b)”用"b"的value替换。注:上面的map只是一个例子而己,实际情况可能更复杂。

 

下面将我的答案与大家分享一下, 如果大家有什么更高效的算法,也可以和大家分享一下。

        1.答:方法一:首先将整个字符串中的字符的顺序颠倒,然后将新的字符串中的单词内部的字符的顺序颠倒。如下图:


 

  方法二:首先将整个字符串进行一种特殊的切割,在上图1中的字符串,切割后为:"word1","    ","word2","    ","word3",

"     ","word4"。将切割完的多个字符串按顺序放入一个动态数组中(如:vector)。然后从动态数组的尾部向头部方向,将此动态数组中的字符串依次复制到原字符串数组中。



上述两种方法,我更倾向于用第二种方法。从容易理解的层面上来说,第二种方法会更容易理解,更复合人类的思维方式。第一种方法用到了的常用的分治法,在程序设计时,需要多注意字符串的边缘处理。从性能上讲,第二种方法也有更高的性能。第一种方法的执行过程有三个时间段:n/2,X/2,X,N。其中n/2表示整个字符串完全反转时间,第一个X/2中的X表示平均单词长度,X/2表示每个单字反转时间,而后面的X表示识别一个单词的起始位置和结束位置所需的时间,最后N表示的单词个数,需要遍历的多个单词的时间。所以第一种方法的时间为n/2+(X/2)*N+X*N+N。

                第二种方法的时间可以分为两段:n,n。前一个n表示识别并切割字符串的时间,后一个n表示将切割好的字符串复制到原字符串的时间。总的时间为2n。

            2.方法一:括号序列中的每个位置只可以放两种元素中的一种:‘(’或‘)’。具体方法为:按位置的顺序来生成此括号序列,如:第一个位置要么放‘(’,要么放‘)’;第二个位置要么放‘(’,要么放‘)’……。由此生成的多个括号序列是一种二叉树结构的解,在动态生成解的过程中可以进行两种有效的剪枝:第一,在放下的左括号和右括号的数目相同时,下一步不能再放右括号;第二,左括号和右括号都有一个个数上限。在生成树枝的过程中,可以同时进行括号配对。最后当结果树到达叶子结点时,可以查看是否是全部配对成功,然后选择输出相应的括号序列。如下图:



方法二:首先使用生成排列数的方法生成括号序列,然后进行合法性判断。

            这两个方法相比,方法一的优势是明显的,它不会产生重复的括号序列,但是方法二会产生重复的括号序列,并且方法二需要在生成括号序列后,再去判断合法性。方法一可以一边生成一边判断,只是需要使用多次递归。

            3.首先定义一个map数据结构:map< const char *, list >,这个数据结构(以下称为n_map)中的key用于存放题目所给map(以下称p_map)中的key,而其中的value是一个list,用于记录p_map中key对应的字符串中的“()”中的内容。首先遍历p_map,对于其中的每个元素,提取出value对应的串中的所有的“()”中的内容,组成list,然后将存入n_map中。接着反复遍历n_map,查找value中list内无元素的。当查找到一个后(设查到的元素的key为p_key),就用另一个迭代器重新遍历n_map,找到元素的list中是否含有p_key。如果有(设为n_key),将p_map中对应n_key位置的value值中的“()”结构使用p_key对应位置元素的value值替换,然后将n_key中list中的p_key删除。同时,在n_map中删除key为p_key的元素。如此反复执行,直到n_map为空,证明替换完成。  

原创粉丝点击