谷歌(Google)历年编程真题——数组和字符串(螺旋矩阵)

news2025/1/17 1:48:45

Google 希望了解你的编码技能和专业技术知识,包括工具、编程语言,以及关于数据结构和算法等主题的一般知识。讨论过程中通常会反复提到相关的话题,就像在工作中的讨论那样,从而推动彼此思考并学习不同的方法。无论你的工作经验如何,Google 都非常重视你的分析能力。请准备好展示你在数据结构和算法方面的扎实功底。

螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1

在这里插入图片描述

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2

在这里插入图片描述

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

思路一:

我们可以按照顺时针螺旋的顺序遍历矩阵,每次取出最外层的元素,并不断缩小矩阵的范围,直到遍历完所有元素。具体步骤如下:

  1. 初始化四个变量:上边界 top、下边界 bottom、左边界 left、右边界 right,分别表示当前遍历范围的边界。
  2. 按照顺时针螺旋的顺序遍历矩阵,并将元素添加到结果列表中。
  3. 每次遍历完一行或一列后,更新边界值,缩小遍历范围。
  4. 循环直到所有元素都被遍历完。

代码示例1

def spiralOrder(matrix):
    if not matrix:
        return []

    result = []
    m, n = len(matrix), len(matrix[0])
    top, bottom, left, right = 0, m - 1, 0, n - 1

    while top <= bottom and left <= right:
        # 从左到右遍历上边界
        for i in range(left, right + 1):
            result.append(matrix[top][i])
        top += 1

        # 从上到下遍历右边界
        for i in range(top, bottom + 1):
            result.append(matrix[i][right])
        right -= 1

        # 从右到左遍历下边界
        if top <= bottom:
            for i in range(right, left - 1, -1):
                result.append(matrix[bottom][i])
            bottom -= 1

        # 从下到上遍历左边界
        if left <= right:
            for i in range(bottom, top - 1, -1):
                result.append(matrix[i][left])
            left += 1

    return result

# 示例 1
matrix1 = [[1,2,3],[4,5,6],[7,8,9]]
print(spiralOrder(matrix1)) # 输出:[1,2,3,6,9,8,7,4,5]

# 示例 2
matrix2 = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
print(spiralOrder(matrix2)) # 输出:[1,2,3,4,8,12,11,10,9,5,6,7]

这个函数首先初始化四个变量表示当前遍历范围的边界。然后按照顺时针螺旋的顺序遍历矩阵,并将元素添加到结果列表中。每次遍历完一行或一列后,更新边界值,缩小遍历范围。最后返回结果列表。

思路二:

另一种解题思路是模拟整个顺时针螺旋的过程,按照方向逐步移动并填入元素。具体步骤如下:

  1. 初始化结果数组 result 和方向数组 directions
  2. 依次填入元素,按照右、下、左、上的方向移动,直到遍历完所有元素。
  3. 在每个方向上移动的过程中,需要注意边界条件,以及当遍历完某一行或某一列后需要更新边界。
  4. 循环直到遍历完所有元素。

代码示例2

def spiralOrder(matrix):
    if not matrix:
        return []

    result = []
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # 右、下、左、上
    m, n = len(matrix), len(matrix[0])
    visited = [[False] * n for _ in range(m)]  # 标记已经访问过的元素
    row, col = 0, 0
    direction_index = 0

    for _ in range(m * n):
        result.append(matrix[row][col])
        visited[row][col] = True

        next_row, next_col = row + directions[direction_index][0], col + directions[direction_index][1]
        if 0 <= next_row < m and 0 <= next_col < n and not visited[next_row][next_col]:
            row, col = next_row, next_col
        else:
            direction_index = (direction_index + 1) % 4
            row, col = row + directions[direction_index][0], col + directions[direction_index][1]

    return result

# 示例 1
matrix1 = [[1,2,3],[4,5,6],[7,8,9]]
print(spiralOrder(matrix1)) # 输出:[1,2,3,6,9,8,7,4,5]

# 示例 2
matrix2 = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
print(spiralOrder(matrix2)) # 输出:[1,2,3,4,8,12,11,10,9,5,6,7]

这个函数首先初始化结果数组 result 和方向数组 directions。然后依次填入元素,按照右、下、左、上的方向移动,直到遍历完所有元素。在每个方向上移动的过程中,需要注意边界条件,以及当遍历完某一行或某一列后需要更新边界。最后返回结果数组。

谷歌(Google)技术面试系列

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

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

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

相关文章

Whisper报错:ffmpeg返回异常值1

本地使用cmd命令显示ffmpeg可以用&#xff0c;但是使用python代码调用whisper包就报错。 查看了whisper源码&#xff0c;发现其也是调用的cmd来使用ffmpeg&#xff0c;于是修改其audio.py中的audio方法中ffmpeg的具体位置完美运行。

基于单片机电阻炉模糊算法控制性系统设计

**单片机设计介绍&#xff0c;基于单片机电阻炉模糊算法控制性系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机电阻炉模糊算法控制性系统的设计概要主要包括硬件设计、软件设计以及模糊控制算法的应用。以下是…

【Spring进阶系列丨第七篇】Spring框架新注解分类及详解

文章目录 一、Spring新注解1.1、Configuration注解1.1.1、定义一个类1.1.2、使用Configuration注解修饰类1.1.3、作用 1.2、Bean注解1.2.1、定义bean1.2.2、在主配置类中注册bean1.2.3、测试容器中是否有该bean1.2.4、注册bean的同时可以指定bean名称1.2.5、补充内容1.2.5.1、案…

计算机接口(部分实验)

;实验三&#xff1a; ;*******************************; ;* 8255方式0的C口输入,A口输出 *; ;*******************************; io8255a equ 288h io8255c equ 28ah io8255 equ 28bhcode segmentassume cs:code start: mov dx, 28bH ;设8255为…

Vue3 项目实例(二)vite.config.ts的配置与axios安装

一、vite.config.ts的配置 1、对相对路径的处理&#xff08;&#xff09; import { defineConfig } from vite import vue from vitejs/plugin-vue // vite 提供node核心对象path import path from path // https://vitejs.dev/config/ export default defineConfig({plugins…

FPGA高端项目:解码索尼IMX327 MIPI相机+2路视频融合叠加,提供开发板+工程源码+技术支持

目录 1、前言2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理HLS多路视频融合叠加图像缓存HDMI输出工程…

数字化赋能乡村:开启乡村发展新纪元

随着信息技术的迅猛发展和数字化浪潮的席卷&#xff0c;乡村发展正迎来前所未有的机遇与挑战。数字化赋能乡村&#xff0c;不仅是推动农业现代化、提升农村治理水平的必由之路&#xff0c;更是开启乡村发展新纪元的关键所在。本文将围绕数字化赋能乡村这一主题&#xff0c;探讨…

【React】React知识要点记录

描述UI 万物皆组件 为什么多个 JSX 标签需要被一个父元素包裹&#xff1f; 切勿将数字放在 && 左侧 React 中为什么需要 key&#xff1f; React 为何侧重于纯函数? 渲染树 模块依赖树 添加交互 React如何传递事件处理函数&#xff1f; React 如何知道返回哪个 sta…

带你了解自动驾驶中的功能安全

谈一谈自动驾驶中的功能安全 附赠自动驾驶学习资料和量产经验&#xff1a;链接 一 概述 汽车涉及到人的生命财产安全&#xff0c;谈汽车首先要谈的就是安全。目前自动驾驶的安全主要分为三大块&#xff1a;功能安全&#xff0c;网络&#xff08;信息&#xff09;安全&#xf…

阿里云8核32G云服务器租用优惠价格表,包括腾讯云和京东云

8核32G云服务器租用优惠价格表&#xff0c;云服务器吧yunfuwuqiba.com整理阿里云8核32G服务器、腾讯云8核32G和京东云8C32G云主机配置报价&#xff0c;腾讯云和京东云是轻量应用服务器&#xff0c;阿里云是云服务器ECS&#xff1a; 阿里云8核32G服务器 阿里云8核32G服务器价格…

自动驾驶_交通标志识别:各目标检测算法评测

自动驾驶|交通标志识别&#xff1a;各目标检测算法评测 论文题目&#xff1a;Evaluation of Deep Neural Networks for traffic sign detection systems 开源代码&#xff1a;https://github.com/aarcosg/traffic-sign-detection 附赠自动驾驶学习资料和量产经验&#xff1a;…

【好书推荐-第十四期】《 互联网大厂晋升指南:从P5到P9的升级攻略》

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

【Linux】Ubuntu 压缩与解压缩

首先在Windows下安装7Zip压缩软件&#xff0c;以便于可以生成 .tar 和 .bz2 的压缩格式的文件。例如新建一个test文件夹&#xff0c;操作后如下。 gzip 压缩工具&#xff1a;负责 .gz 格式的文件的压缩和解压缩&#xff0c;gzip --help 查看使用帮助&#xff1b; 压缩文件&…

【Android】图解View的工作流程原理

文章目录 入口DecorView如何加载到Window中MeasureSpec MeasureView的测量ViewGroup的测量 LayoutView的layout() Draw1、绘制背景3、绘制View内容4、绘制子View6、绘制装饰 入口 DecorView如何加载到Window中 MeasureSpec 该类是View的内部类&#xff0c;封装View的规格尺寸…

下一个电商风口会是什么呢?揭秘电商新蓝海,我来告诉你答案!

大家好&#xff0c;我是电商花花。 直播电商还能持续多久呢&#xff1f; 这个电商项目你肯定没听过&#xff0c;叫视频号小店&#xff0c;只有电商老炮才知道&#xff0c;这是2024年乃至今后3年的风口。 我做电商这么多年&#xff0c;在视频号小店刚出台就开始研究视频号&am…

IDEA删除块注释(文档注释)/**

1. 问题缘由 在使用java写LeetCode的时候&#xff0c;有些题会有一些封装好的类&#xff0c;在本地编写代码的时候&#xff0c;如果没有定义好这些类&#xff0c;就会爆红&#xff0c;看着很难受&#xff0c;此时可以把官方定义好的类拿过来&#xff0c;但是这些类是有块注释的…

电商-广告投放效果分析(KMeans聚类、数据分析-pyhton数据分析

电商-广告投放效果分析&#xff08;KMeans聚类、数据分析&#xff09; 文章目录 电商-广告投放效果分析&#xff08;KMeans聚类、数据分析&#xff09;项目介绍数据数据维度概况数据13个维度介绍 导入库&#xff0c;加载数据数据审查相关性分析数据处理建立模型聚类结果特征分析…

基于单片机电容介电常数测量显示系统设计

**单片机设计介绍&#xff0c;基于单片机电容介电常数测量显示系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机电容介电常数测量显示系统的设计&#xff0c;是一个集成了电子技术、单片机编程、电容测量以及显…

uni-app如何实现高性能

这篇文章主要讲解uni-app如何实现高性能的问题&#xff1f; 什么是uni-app&#xff1f; 简单说一下什么是uni-app&#xff0c;uni-app是继承自vue.js&#xff0c;对vue做了轻度定制&#xff0c;并且实现了完整的组件化开发&#xff0c;并且支持多端发布的一种架构&#xff0c…

【Python】 小顶堆:困难 Leetcode 23. 合并 K 个升序链表 -- Python中heapq对于自定义数据类型的比较

描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 代码 代码1 由于可能存在相同…