📜  谷歌面试体验 | Set 7(软件工程实习生)(1)

📅  最后修改于: 2023-12-03 15:28:12.870000             🧑  作者: Mango

谷歌面试体验 | Set 7(软件工程实习生)

介绍

本次面试针对的是软件工程实习生,谷歌要求应聘者拥有扎实的编程基础、对数据结构和算法有深入理解,并且要求应聘者对软件工程有基本的了解。以下是本次面试的流程和参考答案,希望对准备谷歌实习面试的程序员有所帮助。

面试流程
第一轮面试

第一轮面试主要是关于数据结构、算法和编程语言的问题。

  • 问答题:有哪些数据结构?请谈谈其中任意两种数据结构的区别。
  • 编程实现:请实现一个查找单链表倒数第N个节点的算法。代码需要包含单元测试。
第二轮面试

第二轮面试是一道较难的编程题,需要应聘者在45分钟内完成。

题目:给定一个整数数组,其中每一项的值代表相应下标元素需要移动的距离,正数表示向右移动,负数表示向左移动。要求编写程序输出按照指定顺序移动后的数组。例如,给定数组[1, -2, 3, -4, 5, -6, 7, -8, 9],移动顺序为[2, 4, 1, -3],则输出为[5, -6, 9, -2, 1, -4, 3, -8, 7]。

第三轮面试

第三轮面试主要是关于软件工程的问题。

  • 问答题:什么是软件工程?其中包含哪些方面?
  • 设计题:设计一个日历应用,支持日程添加,时间查看,事件提醒等功能。请画出该应用的框架设计图。
第四轮面试

第四轮面试是谷歌的技术领袖面试,主要是考察应聘者对软件工程的深度理解和对未来技术的前瞻性思考。

  • 问答题:请谈谈您对软件工程的看法和理解,以及您未来几年的职业规划。
  • 设计题:请设计一个自我学习算法的机器人。该机器人需要学习一个新的算法,然后通过解答问题不断深入学习并提高自己的能力。请给出您的整体设计思路和实现方案。
参考答案
第一轮面试
  • 数据结构包括数组、链表、栈、队列、哈希表、树、图等。其中数组和链表的主要区别是数组的大小是固定的,而链表的大小是动态分配的。
  • 题解:
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        dummy = ListNode(0)
        dummy.next = head
        p1 = dummy
        p2 = dummy
        for i in range(n):
            p2 = p2.next
        while p2.next != None:
            p1 = p1.next
            p2 = p2.next
        p1.next = p1.next.next
        return dummy.next
第二轮面试

题解:

def move_array(nums, order):
    if len(nums) == 0:
        return []
    n = len(nums)
    max_idx = 0
    for i in range(n):
        if nums[i] > nums[max_idx]:
            max_idx = i
    for i in range(len(order)):
        if order[i] > 0:
            nums[max_idx: max_idx - order[i]: -1], nums[max_idx - order[i] + 1:max_idx + 1: 1] = nums[max_idx - order[i] + 1:max_idx + 1: 1], nums[max_idx: max_idx - order[i]: -1]
        else:
            nums[max_idx: max_idx + abs(order[i]) + 1: 1], nums[max_idx + abs(order[i]): max_idx + 1: -1] = nums[max_idx + abs(order[i]): max_idx + 1: -1], nums[max_idx: max_idx + abs(order[i]) + 1: 1]
            max_idx += abs(order[i])
    return nums
第三轮面试
  • 软件工程是一种对软件生产过程的理论和方法的研究,其目的是应用工程的方法来设计、开发、维护和管理软件。软件工程包含需求分析、系统设计、编码、测试、版本管理、项目管理、软件质量保证等方面。
  • 设计图:

calendar_design.png

第四轮面试
  • 我认为软件工程是一门复杂的、有挑战性的学科,它涵盖了多个方面,包括需求分析、系统设计、编码、测试、版本管理和项目管理等。我的理解是,软件工程既是一门学科,也是一门实践。我的未来职业规划是在软件工程领域深挖并拓展自己的技能,成为一名资深的软件工程师,并为公司的发展做出贡献。
  • 机器人的设计思路是运用机器学习算法对机器人进行自我学习。其中,机器人利用一些基本算法的示例进行训练,接着自行探索并解决问题,同时不断优化算法。实现方案则是通过在机器人内部创建一个神经网络,在网络中嵌入强化学习方式,以及在机器人的算法库中添加并持续更新基本算法模块,使得机器人能在实际应用中进行不断的学习和完善。