广联达 2015笔试编程题

广联达:

去了就是去做做题练练手的,也顺便看能不能弄个面试。

编程题一:

给出一组数,表示公司员工的年龄(无序),要求求出最小的年龄差。且要求时间复杂度小于O(N^2).

如果最简单的两重循环肯定可以得到结果,但是时间复杂度不合要求。一般想法是,先排序再遍历求解。选择快排和堆排序等时间复杂度为O(NlogN)的。

解答一:先排序后遍历一遍,遍历求出最小年龄差。排序选择库函数qsort,方便快捷。时间复杂度O(NlogN)+O(N)

解答二:既然都想到了排序,hash应该是必须的。申明大小为100的数组,将每个年龄是否出现进行统计,然后遍历求出最小年龄差就可以了。时间复杂度O(N)。(我居然没有想到!!)

编程题二:

给出单链表中某一个节点的指针,要求在O(1)的时间复杂度内删除该节点。
函数形式void delete(Node ** root, Node * pToBeDeleted);

解法如图:
删除节点

编程题三:

给出一些名词、动词和副词,并规定语法规则,判断给出的句子是否符合语法规则。

语法规则:

  • sentence = Noun + Verb
  • sentence = sentence + adverb + sentence

词汇上给定名词 birds、flowers等,动词fly、grow等,副词and、or等

分析:因为这题就写了点想法和伪代码,不瞎说了。

感觉有点编译原理的味道,想法就是循环/递归来做。

  1. 先判断是否为一个名词+动词的句子。是,返回true,否则返回false。
  2. 判断后面是否有副词
  3. 如果有,重复第1步
  4. 如果没有,是文件结尾,则true,否则false

你可能感兴趣的:(校园招聘,广联达)