谷歌(Google)技术面试概述

概述

谷歌(Google)技术面试非常困难而且富有挑战性。想要获得电话面试,你需要将简历提交到他们的在线申请系统或者通过内部员工进行推荐。

假设你通过了简历审阅,招聘人员会联系你。通常情况下会有两次电话面试,如果表现优秀,你将会获邀参与现场面试.

由于谷歌业务往往涉及大规模应用场景,请准备好回答关于如何扩展为多台机器编写的算法的大量后续问题。例如:岛屿的个数、两个数组的交集 II。

一、岛屿的个数

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。
示例 1
输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1

示例 2
输入:grid = [
[“1”,“1”,“0”,“0”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“1”,“0”,“0”],
[“0”,“0”,“0”,“1”,“1”]
]
输出:3

1.深度优先搜索(DFS)

我们可以使用深度优先搜索(DFS)来解决这个问题:

def numIslands(grid):def dfs(grid, i, j):if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] == '0':returngrid[i][j] = '0' # 将访问过的陆地标记为 '0'dfs(grid, i+1, j) # 上下左右进行深度优先搜索dfs(grid, i-1, j)dfs(grid, i, j+1)dfs(grid, i, j-1)if not grid:return 0num_islands = 0for i in range(len(grid)):for j in range(len(grid[0])):if grid[i][j] == '1': # 如果是陆地,则进行深度优先搜索num_islands += 1dfs(grid, i, j)return num_islands

这个函数首先定义了一个辅助函数 dfs(),用于深度优先搜索并将访问过的陆地标记为 ‘0’,然后遍历整个网格,对每个未访问过的陆地进行深度优先搜索,计算岛屿的数量。

2.广度优先搜索(BFS)

除了深度优先搜索(DFS)之外,还可以使用广度优先搜索(BFS)来解决这个问题:

from collections import dequedef numIslands(grid):def bfs(grid, i, j):queue = deque([(i, j)])while queue:x, y = queue.popleft()if x < 0 or x >= len(grid) or y < 0 or y >= len(grid[0]) or grid[x][y] == '0':continuegrid[x][y] = '0' # 将访问过的陆地标记为 '0'queue.append((x+1, y)) # 将上下左右未访问过的陆地加入队列queue.append((x-1, y))queue.append((x, y+1))queue.append((x, y-1))if not grid:return 0num_islands = 0for i in range(len(grid)):for j in range(len(grid[0])):if grid[i][j] == '1': # 如果是陆地,则进行广度优先搜索num_islands += 1bfs(grid, i, j)return num_islands

这个函数首先定义了一个辅助函数 bfs(),用于广度优先搜索并将访问过的陆地标记为 ‘0’,然后遍历整个网格,对每个未访问过的陆地进行广度优先搜索,计算岛屿的数量。

二、两个数组的交集 II

给你两个整数数组 nums1 和 nums2,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

示例 1

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

提示

1 <= nums1.length, nums2.length <= 1000 0 <= nums1[i], nums2[i] <=1000

1.哈希表

首先,我们可以使用哈希表来解决这个问题。遍历一个数组,用哈希表记录每个数字出现的次数,然后遍历另一个数组,检查其中的数字在哈希表中是否存在,如果存在,则将该数字添加到结果列表中,并减少哈希表中该数字的计数。

from collections import Counterdef intersect(nums1, nums2):# 统计 nums1 和 nums2 中各数字出现的次数counter1 = Counter(nums1)counter2 = Counter(nums2)# 初始化结果列表result = []# 遍历哈希表 counter1 中的键值对for num, count in counter1.items():# 检查当前数字在 counter2 中是否存在if num in counter2:# 如果存在,则将该数字添加到结果列表中,次数取较小值result.extend([num] * min(count, counter2[num]))return result

这个函数首先利用 Counter 类统计了 nums1nums2 中各数字出现的次数。然后遍历 counter1 中的键值对,检查当前数字在 counter2 中是否存在,如果存在,则将该数字添加到结果列表中,次数取较小值。最后返回结果列表。

2.双指针

除了使用哈希表之外,还可以使用双指针来解决这个问题。首先对两个数组进行排序,然后使用两个指针分别指向两个数组的起始位置,比较两个指针指向的数字,如果相等,则将该数字添加到结果列表中,并将两个指针都向后移动一位;如果不相等,则将较小的数字所在的指针向后移动一位。重复这个过程直到某个指针达到数组末尾。

def intersect(nums1, nums2):# 对两个数组进行排序nums1.sort()nums2.sort()# 初始化结果列表和双指针result = []p1, p2 = 0, 0# 循环比较两个数组中的数字while p1 < len(nums1) and p2 < len(nums2):if nums1[p1] == nums2[p2]:# 如果两个数字相等,则将该数字添加到结果列表中,并将两个指针都向后移动一位result.append(nums1[p1])p1 += 1p2 += 1elif nums1[p1] < nums2[p2]:# 如果 nums1[p1] < nums2[p2],则将 p1 向后移动一位p1 += 1else:# 如果 nums1[p1] > nums2[p2],则将 p2 向后移动一位p2 += 1return result

这个函数首先对两个数组进行排序,然后初始化两个指针指向数组的起始位置。然后循环比较两个数组中的数字,如果两个数字相等,则将该数字添加到结果列表中,并将两个指针都向后移动一位;如果不相等,则将较小的数字所在的指针向后移动一位。最后返回结果列表。

谷歌(Google)技术面试系列

  • 谷歌(Google)历年编程真题——数组和字符串(螺旋矩阵)
  • 谷歌(Google)历年编程真题——数组和字符串(加一)
  • 谷歌(Google)技术面试——在线评估问题(一)
  • 谷歌(Google)技术面试——在线评估问题(二)
  • 谷歌(Google)技术面试——在线评估问题(三)
  • 谷歌(Google)技术面试——在线评估问题(四)
  • 谷歌(Google)技术面试——全部面试流程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/798550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PyQt5篇】和子线程进行通信

文章目录 &#x1f354;使用QtDesigner进行设计&#x1f6f8;和子线程进行通信&#x1f388;运行结果 &#x1f354;使用QtDesigner进行设计 我们首先使用QtDesigner设计界面 得到代码login.ui <?xml version"1.0" encoding"UTF-8"?> <ui …

Win10 桌面上应用程序的图标快捷键失效都变成白色图标 怎么修复?

环境&#xff1a; Win10 专业版 问题描述&#xff1a; Win10 桌面上应用程序的图标快捷键失效都变成白色图标 怎么修复 解决方案&#xff1a; 1.资源管理器&#xff0c;把“隐藏的项目”的打钩去掉,打开隐藏文件 2.在文件资源管理器的地址栏输入%localappdata%快速访问这…

C顺序表:通讯录

目录 前言 通讯录数据结构 通讯录初始化 查找名字 增加联系人 删除联系人 展示所有联系人 查找联系人 修改信息 销毁通讯录 完整通讯录代码 前言 数据结构中的顺序表如果已经学会了&#xff0c;那么我们就可以基于顺序表来完成一个通讯录了 通讯录其实我们使用前…

Coding and Paper Letter(八十八)

系列重启之CPL。 1 Coding: 1.一个Python库用来分析城市路网的工具箱&#xff0c;城市形态分析工具。 Madina 2.SkyPilot&#xff1a;在任何云上运行 LLM、AI 和 Batch。 通过简单的界面即可实现最大程度的节省性能、最高的 GPU 可用性和托管执行。 skypilot 3.探索美国卫…

creo扫描杯子学习笔记

creo扫描杯子学习笔记 扫描2要素&#xff1a; 轨迹&#xff0c; 截面。 多用于曲线扫描&#xff0c;区别于拉伸命令。 大小自定 旋转扫描 抽壳 草绘把手 扫描把手 复制曲面 实例化切除 成型

NOI - OpenJudge - 2.5基本算法之搜索 - 2753:走迷宫 - 超级无敌详细题解(含多个不同算法AC代码)

点赞关注吧~ 2753:走迷宫 查看提交统计提问 总时间限制: 1000ms 内存限制: 65536kB 描述 一个迷宫由R行C列格子组成&#xff0c;有的格子里有障碍物&#xff0c;不能走&#xff1b;有的格子是空地&#xff0c;可以走。 给定一个迷宫&#xff0c;求从左上角走到右下角最…

08 | Swoole 源码分析之 Timer 定时器模块

原文首发链接&#xff1a;Swoole 源码分析之 Timer 定时器模块 大家好&#xff0c;我是码农先森。 引言 Swoole 中的毫秒精度的定时器。底层基于 epoll_wait 和 setitimer 实现&#xff0c;数据结构使用最小堆&#xff0c;可支持添加大量定时器。 在同步 IO 进程中使用 seti…

无法直接启动带有”类库输出类型“的项目。若要调试此项目,请向引用库项目的此解决方案中添加可执行项目将此可执行项目设置为启动项目,

当你尝试直接启动一个类库&#xff08;Class Library&#xff09;项目时&#xff0c;你会遇到这样的错误消息&#xff0c;因为类库项目本身不生成可执行文件&#xff08;如 .exe 文件&#xff09;&#xff0c;它们只是包含可以被其他程序或应用程序引用的代码。 为了调试类库项…

今年过去了多少天?(switch)

//今年已经过去了几天&#xff1f; #include <stdio.h> int monthday(int year,int month){switch(month){case 1:return 31;case 2:if ((year % 4 0 && year % 100 ! 0)||year % 400 0){return 29;}else{return 28;}break;case 3:return 31;case 4:return 30;…

C语言进阶课程学习记录-第24课 - #pragma 使用分析

C语言进阶课程学习记录-第24课 - #pragma 使用分析 #pragma实验-#pragma messagecmd窗口运行 实验-pragma oncebcc编译报错gcc编译成功global.h代码优化 #pragma pack实验BCC编译器输出 小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程…

Php中依赖注入是怎样的

PHP依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;用于解决软件组件之间的耦合问题。在依赖注入中&#xff0c;一个对象的依赖项不是由对象本身创建或查找&#xff0c;而是由外部容器或调用者提供。这种方式使得对象更加模…

mysql乐观锁总结和实践:用version或者时间戳

谈到了MySQL悲观锁&#xff0c;但是悲观锁并不是适用于任何场景&#xff0c;它也有它存在的一些不足&#xff0c;因为 悲观锁大多数情况下依靠数据库的锁机制实现 &#xff0c;以保证操作最大程度的独占性。 如果加锁的时间过长&#xff0c;其他用户长时间无法访问&#xff0c;…

k8s1(1),Linux运维基础开发与实践

#设置主机名 hostnamectl hostnameXXX #配置免密(包括操作机) ssh-keygen ssh-copy-id master*/slave* #传输hosts cat > /etc/hosts <<EOF 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain loca…

【Qt 学习笔记】Qt 中出现乱码的解释及讨论

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt 中出现乱码的解释及讨论 文章编号&#xff1a;Qt 学习笔记 / 06 文…

工单派单-saas工单处理软件效益分析,智能解决企业管理痛点亿发

企业对引入工单管理系统是有迫切需求的&#xff0c;工单管理系统可以有效地管理任务和工作流程&#xff0c;提高工作效率和客户满意度。 在没有工单管理系统之前&#xff0c;许多企业可能面临着诸如任务分配不清晰、信息不透明、工作流程混乱等管理挑战。举例来说&#xff0c;…

C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成?

C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成&#xff1f; 手术麻醉系统与医院信息系统的集成是一个关键步骤&#xff0c;它有助于实现信息的共享和流程的协同&#xff0c;从而提高医疗服务的效率和质量。手麻系统与lis、his、pacs等系统的对接是医院信息化建设的重…

Leetcode 148. 排序链表

心路历程&#xff1a; 这道题通过很简单&#xff0c;但是如果想要用O(1)的空间复杂度O(nlogn)的时间复杂度的话&#xff0c;可能得需要双指针快排的思路。 解法&#xff1a;遍历模拟 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0…

Java基础入门--Java API课后题

五、编程题 1.编写一个每次随机生成 10个 0&#xff08;包括&#xff09; 到 100 之间的随机正整数。 import java.util.Random;public class Example01{public static void main(String[] args) {for(int i0;i<10;i) {System.out.println(new Random().nextInt(0,100));}}…

【黑马头条】-day05延迟队列文章发布审核-Redis-zSet实现延迟队列-Feign远程调用

文章目录 昨日回顾今日内容1 延迟任务1.1 概述1.2 技术对比1.2.1 DelayQueue1.2.2 RabbitMQ1.2.3 Redis实现1.2.4 总结 2 redis实现延迟任务2.0 实现思路2.1 思考2.2 初步配置实现2.2.1 导入heima-leadnews-schedule模块2.2.2 在Nacos注册配置管理leadnews-schedule2.2.3 导入表…

MySQL事务以及并发访问隔离级别

MySQL事务以及并发问题 事务1.什么是事务2.MySQL如何开启事务3.事务提交方式4.事务原理5.事务的四大特性&#xff08;ACID&#xff09; 事务并发问题1.并发引起的三个问题2.事务隔离级别 事务 在 MySQL 中&#xff0c;事务支持是在引擎层实现的。MySQL 是一个支持多引擎的系统&…