面试复盘记录(数据开发)

  • 一、apple外包
    • 1.矩阵顺时针旋转遍历
    • 2.两表取差集
  • 二、

一、apple外包

没问理论,就两个算法题。

1.矩阵顺时针旋转遍历

Given an m x n matrix, return all elements of the matrix in spiral order.Example 1:Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [1,2,3,6,9,8,7,4,5]Example 2:Input: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]Constraints:m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100

这题当时没写出来,一直想基于矩阵的下标使用循环完成,因为对于顺时针循环,横纵坐标x, y的变化特点是x, y先分别自增,然后分别自减。当时因为在边界值这块没处理好代码一直没跑起来。后来面试完才想起来切片实现就不用太考虑边界值的问题了。下面分别按照切片的方式和动态调整边界值的方式重新解下这道题。

import pandas as pd
import numpy as npmatrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]def solution1(matrix):"""方法一:通过切片方式实现"""row, col = len(matrix), len(matrix[0])matrix = np.asarray(matrix).reshape(row, col)output = []while len(matrix) > 0:  # 无论横着切还是竖着切,当二维矩阵被切完时会变成一维数组# top 注意切片取值范围[)for i in range(col):output.append(matrix[0][i])matrix = matrix[1:]# rightif len(matrix) > 0:for i in range(row - 1):output.append(matrix[i][-1])matrix = matrix[:, :-1]# bottomif len(matrix) > 0:for i in reversed(range(col - 1)):output.append(matrix[-1][i])matrix = matrix[:-1]# leftif len(matrix) > 0:for i in reversed(range(row - 2)):output.append(matrix[i][0])matrix = matrix[:, 1:]if len(matrix) > 0:row, col = len(matrix), len(matrix[0])else:return outputdef solution2(matrix):"""方法二:通过矩阵的上下左右四个边界值,每遍历完一个边界动态的调整该边界的边界值实现"""row, col = len(matrix), len(matrix[0])matrix = np.asarray(matrix).reshape(row, col)top, bottom, left, right = 0, row - 1, 0, col - 1output = []while left <= right and top <= bottom:# 刚进入while循环可以不用卡边界,此时边界值还未调整# 遍历上边界,+1是因为range取值[),后面-1也是同理for i in range(left, right + 1):output.append(matrix[top][i])top += 1# 上下遍历时需要卡左右边界没有互相越界# 遍历右边界if left <= right:for i in range(top, bottom + 1):output.append(matrix[i][right])right -= 1# 左右遍历卡上下边界未越界# 遍历下边界if top <= bottom:for i in range(right, left - 1, -1):output.append(matrix[bottom][i])bottom -= 1# 遍历左边界if left <= right:for i in range(bottom, top - 1, -1):output.append(matrix[i][left])left += 1return outputprint(f"方法1:{solution1(matrix)}")
print(f"方法2:{solution2(matrix)}")

在这里插入图片描述

2.两表取差集

The difference(Relative Complement) between two sets A and B is defined as A - B := {x|x ∈ A ∧ x ∉ B}. Assume that the set allows duplicate elements. For example, the difference between A = (5, 6, 6, 7) and B = (6, 7, 8) is A - B = (5, 6).Consider each row in a Table as element of the set. Given two Tables t1 and t2, return the difference t1 - t2.Note that column names in two Tables are identical.Example 1:Input:
+-------------+
|     t1     |
+------+------+
| col1 | col2 |
+------+------+
| 1    | 3    |
| 1    | 4    |
| 1    | 4    |
| 2    | 5    |
| 4    | 5    |
+------+------++-------------+
|     t2     |
+------+------+
| col1 | col2 |
+------+------+
| 1    | 3    |
| 1    | 4    |
| 1    | 6    |
| 2    | 5    |
| 3    | 5    |
+------+------+Output:
+-------------+
|    output   |
+------+------+
| col1 | col2 |
+------+------+
| 1    | 4    |
| 4    | 5    |
+------+------+Example 2:Input:
+-------------+
|     t1     |
+------+------+
| col1 | col2 |
+------+------+
| 1    | 3    |
| 1    | 4    |
| 1    | 4    |
+------+------++-------------+
|     t2     |
+------+------+
| col1 | col2 |
+------+------+
| 1    | 3    |
| 1    | 4    |
| 1    | 4    |
| 1    | 4    |
| 3    | 5    |
+------+------+Output:
+-------------+
|    output   |
+------+------+
| col1 | col2 |
+------+------+
+------+------+

面试中用的最简单直接的方式解决,依次判断t1中的元素是否在t2中,在的话都移出去:

import pandas as pd# Example 1:
t1 = pd.DataFrame(data=[[1, 3], [1, 4], [1, 4], [2, 5], [4, 5]], columns=['col1', 'col2'])
t2 = pd.DataFrame(data=[[1, 3], [1, 4], [1, 6], [2, 5], [3, 5]], columns=['col1', 'col2'])def solution(t1, t2):list1 = t1.values.tolist()list2 = t2.values.tolist()res = []for value in list1:if value in list2:list2.remove(value)  # remove方法会删掉第一次出现的指定值valueelse:res.append(value)return pd.DataFrame(data=res, columns=['col1', 'col2'])print(solution(t1, t2))

在这里插入图片描述

这题一开始我想用SQL实现,但是因为两个表里都可以有重复数据,比如说对于数据A,t1表有两个A,t2表有一个A,那么关联的时候t1的两个A都能和t2的一个A关联上,而根据题意,t1两个A减去t2一个A,还应剩下一个A,当时的卡点在这。导致SQL的实现没有完成,后被提示开窗函数,才想起来可以通过row_number为相同的A打上序号标签,关联的时候加上序号限制就可以了。

下面是具体代码实现:

import pandas as pd
from pandasql import sqldf"""
因为涉及到开窗函数,所以不能仅通过pandas中的join完成需求。查看pandas的api发现并不能直接基于df写sql
查看资料后发现可以通过引入第三方库pandasql实现。pandasql文档:https://pypi.org/project/pandasql/0.7.3/
"""# Example 1:
t1 = pd.DataFrame(data=[[1, 3], [1, 4], [1, 4], [2, 5], [4, 5]], columns=['col1', 'col2'])
t2 = pd.DataFrame(data=[[1, 3], [1, 4], [1, 6], [2, 5], [3, 5]], columns=['col1', 'col2'])def solution(t1, t2):pysqldf = lambda q: sqldf(q, globals())return pysqldf("""select distinct t1.col1, t1.col2from (select*,row_number() over(partition by col1,col2) as rnfrom t1) t1 left join (select*,row_number() over(partition by col1,col2) as rnfrom t2) t2 on t1.col1=t2.col1 and t1.col2=t2.col2 and t1.rn=t2.rnwhere t2.col1 is null;""")print(solution(t1, t2))

但是上面的代码总是报SQL语法错误,查资料后说的是sqlite3的版本低了,不支持开窗函数,从3.25.0开始支持,我的是3.21.0,升级标准库还需要升级解释器,为了方便直接通过下面代码把数据同步到mysql中实现:

import pandas as pd
from sqlalchemy import create_engine# Example 1:
t1 = pd.DataFrame(data=[[1, 3], [1, 4], [1, 4], [2, 5], [4, 5]], columns=['col1', 'col2'])
t2 = pd.DataFrame(data=[[1, 3], [1, 4], [1, 6], [2, 5], [3, 5]], columns=['col1', 'col2'])engine = create_engine('mysql+pymysql://root:123456@localhost/demo')
t1.to_sql('t1', engine, index=False)
t2.to_sql('t2', engine, index=False)
select distinct t1.col1, t1.col2
from (select*,row_number() over(partition by col1,col2) as rnfrom t1
) t1 left join (select*,row_number() over(partition by col1,col2) as rnfrom t2
) t2 on t1.col1=t2.col1 and t1.col2=t2.col2 and t1.rn=t2.rn
where t2.col1 is null;

在这里插入图片描述

二、

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

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

相关文章

【LeetCode热题100】141. 环形链表(链表)

一.题目要求 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置…

基于FPGA的图像锐化算法(USM)设计

免费获取源码请关注微信号《FPGA学习笔记册》&#xff01; 1.图像锐化算法说明 图像锐化算法在实际的图像处理应用很广泛&#xff0c;例如&#xff1a;医学成像、工业检测和军事领域等&#xff1b;它的作用就是将模糊的图像变的更加清晰。常用的图像锐化算法有拉普拉斯算子、s…

基于SpringCache实现数据缓存

SpringCache SpringCache是一个框架实现了基本注解的缓存功能,只需要简单的添加一个EnableCaching 注解就能实现缓存功能 SpringCache框架只是提供了一层抽象,底层可以切换CacheManager接口的不同实现类即使用不同的缓存技术,默认的实现是ConcurrentMapCacheManagerConcurren…

SpringBoot(Lombok + Spring Initailizr + yaml)

1.Lombok 1.基本介绍 2.应用实例 1.pom.xml 引入Lombok&#xff0c;使用版本仲裁 <!--导入springboot父工程--><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version&g…

wy的leetcode刷题记录_Day86

wy的leetcode刷题记录_Day86 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2024-3-13 前言 目录 wy的leetcode刷题记录_Day86声明前言2864. 最大二进制奇数题目介绍思路代码收获 3. 无重复字符的最长子串题目介绍思路代码收获 438. 找…

Vite为什么比Webpack快

本文作者为 360 奇舞团前端开发工程师 一.引言 Vite和Webpack作为两个主流的前端构建工具&#xff0c;在近年来备受关注。它们的出现使得前端开发变得更加高效和便捷。然而&#xff0c;随着前端项目规模的不断增大和复杂度的提升&#xff0c;构建工具的性能优化也成为了开发者关…

【Mac】鼠标控制\移动\调整窗口大小BBT|边缘触发调整音量\切换桌面

一直在 win 习惯了通过鼠标的侧键来控制窗口的位置、大小&#xff0c;现在找到心的解决方案了&#xff0c;通过 BBT 设置侧键按下\抬起几颗。 以下解决方案的截图&#xff0c;其中还包括了其他操作优化方案&#xff1b; 滚轮配合 cmd 键调节页面大小&#xff1b;配合 option 键…

Docker拉取镜像存储不足

在使用Docker时&#xff0c;我们经常遇到一个问题&#xff0c;就是拉取镜像时提示存储空间不足。这是因为Docker在拉取镜像时需要将镜像文件下载到本地存储中&#xff0c;而有时本地存储空间不足以容纳完整的镜像文件。 本文将介绍一些解决这个问题的方法&#xff0c;并提供相…

简单理解NAT模式和桥接模式

目录 桥接模式NAT模式总结 桥接模式 1.桥接模式下 当物理机X创建了一台或多台虚拟机 那么这些创建出来的虚拟机 可以视作一台独立的新机器 加入了该局域网 并允许和该局域网的物理机或者其他虚拟机直接通信 2.问题一在于 C类网的分配是有范围的(0-255) 假如是一个教室里的局域…

Java集合基础知识总结(绝对经典)

List接口继承了Collection接口&#xff0c;定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理&#xff0c;还添加了面向位置的操作。 实际上有两种list&#xff1a;一种是基本的ArrayList&#xff0c;其优点在于随机访问元素&#xff0c;另一种是更强大的L…

20240313寻找集成联调交付的具体方式

集成联调交付&#xff08;Integrated Joint Debugging and Delivery&#xff09;是软件开发过程中的一个阶段&#xff0c;主要涉及将不同的软件模块或组件整合在一起&#xff0c;并进行联合调试和测试&#xff0c;以确保它们能够作为一个整体正常工作。这个过程通常发生在开发周…

Parade Series - WebRTC ( < 300 ms Low Latency )

Parade Series - FFMPEG (Stable X64) C:\Conda\parading-cam>ffmpeg -f dshow -i video"Surface Camera Front" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -an -rtsp_transport tcp -f rtsp://127.0.0.1:8554/cam0801