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

news2024/11/18 9:45:20

  • 一、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 np

matrix = [[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:]

        # right
        if len(matrix) > 0:
            for i in range(row - 1):
                output.append(matrix[i][-1])
            matrix = matrix[:, :-1]

        # bottom
        if len(matrix) > 0:
            for i in reversed(range(col - 1)):
                output.append(matrix[-1][i])
            matrix = matrix[:-1]

        # left
        if 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 output


def 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 - 1
    output = []
    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 += 1
    return output


print(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方法会删掉第一次出现的指定值value
        else:
            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.col2
        from (
            select
                *,
                row_number() over(partition by col1,col2) as rn
            from t1
        ) t1 left join (
            select
                *,
                row_number() over(partition by col1,col2) as rn
            from t2
        ) t2 on t1.col1=t2.col1 and t1.col2=t2.col2 and t1.rn=t2.rn
        where 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 rn
	from t1
) t1 left join (
	select
		*,
		row_number() over(partition by col1,col2) as rn
	from t2
) t2 on t1.col1=t2.col1 and t1.col2=t2.col2 and t1.rn=t2.rn
where t2.col1 is null;

在这里插入图片描述

二、

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

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

相关文章

岩土工程渗流问题之有限单元法:理论、模块化编程实现、开源程序应用

有限单元法在岩土工程问题中应用非常广泛&#xff0c;很多商业软件如Plaxis/Abaqus/Comsol等都采用有限单元解法。尽管各类商业软件使用方便&#xff0c;但其使用对用户来说往往是一个“黑箱子”。相比而言&#xff0c;开源的有限元程序计算方法透明、计算过程可控&#xff0c;…

【NR 定位】3GPP NR Positioning 5G定位标准解读(八)- OTDOA定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

redis在微服务领域的贡献,字节跳动只面试两轮

dubbo.registry.addressredis://127.0.0.1:6379 注册上来的数据是这样&#xff0c;类型是hash /dubbo/ s e r v i c e / {service}/ service/{category} 如 /dubbo/com.newboo.sample.api.DemoService/consumers /dubbo/com.newboo.sample.api.DemoService/providers has…

Apache Paimon系列之:主键表

Apache Paimon系列之&#xff1a;主键表 一、主键表1.Bucket2.LSM Trees3.Compaction 二、数据分布1.固定Bucket2.动态Bucket3.正常动态Bucket模式4.跨分区更新插入动态存储桶模式 三、Merge Engine1.Deduplicate2.部分更新3.序列组4.聚合部分更新5.聚合6.Retract7.First Row 四…

01-java入门了解--cmd命令、jdk、java的认识

cmd常用命令 java入门需要安装的环境 jdk。&#xff08;下载好jdk&#xff0c;并配置好环境&#xff09;idea。&#xff08;或者其他的编程工具&#xff09; jdk安装目录介绍 第一步&#xff1a;编写程序&#xff08;程序员写.java后缀的文件&#xff09; 第二步&#xff1a;…

【LLMs+小羊驼】23.03.Vicuna: 类似GPT4的开源聊天机器人( 90%* ChatGPT Quality)

官方在线demo: https://chat.lmsys.org/ Github项目代码&#xff1a;https://github.com/lm-sys/FastChat 官方博客&#xff1a;Vicuna: An Open-Source Chatbot Impressing GPT-4 with 90% ChatGPT Quality 模型下载: https://huggingface.co/lmsys/vicuna-7b-v1.5 | 所有的模…

Nuxt3 初学,基础配置,页面结构搭建,引入element

1.下载Nuxt框架 Nuxt 中文站 - 直观的Web框架 Nuxt3文档 NuxtNuxt是一个开源框架&#xff0c;它使web开发直观而强大。自信地创建高性能和生产级全栈web应用程序和网站。https://www.nuxt.com.cn/根据官方文档进行配置 2.配置页面 1.主要页面结构 导航栏内容底部 1.在comp…

最适合Oracle数据库的Linux操作系统?

先声明&#xff1a;以下观点仅供参考。我只引用网上的一些观点&#xff0c;包括官网等。 Oracle数据库认证的Linux操作系统 最近老被问到Oracle Linux免费吗&#xff1f;因为用户需要安装Oracle数据库&#xff0c;面临选择操作系统的问题。 首先&#xff0c;Oracle数据库 19…

模拟电子技术实验(三)

单选题 1.本实验的实验目的中&#xff0c;输出电阻测量是第几个目的&#xff1f; A. 1个。 B. 2个。 C. 3个。 D. 4个。 答案&#xff1a;C 评语&#xff1a;10分 单选题 2. 有一定输出功率的放大器的 “功率”下面理解正确的是&#xff1f; A. 能…

05-ESP32-S3-IDF USART

ESP32-S3 IDF USART详解 USART简介 USART是一种串行通信协议&#xff0c;广泛应用于微控制器和计算机之间的通信。USART支持异步和同步模式&#xff0c;因此它可以在没有时钟信号的情况下&#xff08;异步模式&#xff09;或有时钟信号的情况下&#xff08;同步模式&#xff…

【教学类-34-10】20240313 春天拼图(Midjounery生成线描图,4*4格拼图块)(AI对话大师)

作品展示&#xff1a; 背景需求&#xff1a; 利用华文彩云空心字&#xff08;粗胖字体。凑满9个拼图&#xff09;制作了3*3的拼图块 【教学类-34-09】20240310华文彩云学号拼图&#xff08;3*3格子浅灰底图 深灰拼图块&#xff09;&#xff08;AI对话大师&#xff09;-CSDN博…

3.2 RK3399项目开发实录-初次使用的环境搭建(物联技术666)

通过百度网盘分享的文件&#xff1a;嵌入式物联网单片… 链接:https://pan.baidu.com/s/1Zi9hj41p_dSskPOhIUnu9Q?pwd8qo1 提取码:8qo1 复制这段内容打开「百度网盘APP 即可获取」 1. 用户和密码 1.1. Ubuntu Desktop 系统 Ubuntu Desktop 系统开机启动后&#xff0c;自动登录…

使用Docker在windows上安装IBM MQ

第一步、安装wsl 详见我另一篇安装wsl文章。 第二步、安装centos 这里推荐两种方式&#xff0c;一种是从微软商城安装&#xff0c;一种是使用提前准备好的镜像安装&#xff0c;详见我另一篇windos下安装centos教程。 第三步、安装windows下的Docker desktop 详见我另一篇wind…

yum安装mysql 数据库tab自动补全

centos7上面没有mysql&#xff0c;它的数据库名字叫做mariadb [rootlocalhost ~]#yum install mariadb-server -y [rootlocalhost ~]#systemctl start mariadb.service [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#ss -na…

【LeetCode热题100】240. 搜索二维矩阵 II

一.题目要求 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 ‘每列的元素从上到下升序排列。 二.题目难度 中等 三.输入样例 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7…

Pytorch入门-Transforms

文章目录 ComposeToTensorNormalizeResize 在PyTorch中&#xff0c;transforms是一个用于图像预处理和数据增强的模块&#xff0c;通常与torchvision库一起使用。torchvision提供了大量预先定义的transforms&#xff0c;它们可以方便地应用于图像数据&#xff0c;以进行预处理或…

strcpy的模拟实现

strcpy函数的定义&#xff1a; strcpy函数功能的解释&#xff1a; 会将源字符串中的 内容包括\0 拷贝到目标数组&#xff0c;所以源字符串必须以 \0 结束。 返回值为拷贝完成后的目标数组的首地址。 Const 是因为源字符串的内容不需要被修改&#xff0c;所以const最好。 strcpy…

程序员的三重境界:码农,高级码农、程序员!

见字如面&#xff0c;我是军哥&#xff01; 掐指一算&#xff0c;我在 IT 行业摸爬滚打 19 年了&#xff0c;见过的程序员至少大好几千&#xff0c;然后真正能称上程序员不到 10% &#xff0c;绝大部分都是高级码农而已。 今天和你聊聊程序员的三个境界的差异&#xff0c;文章不…

【DL经典回顾】激活函数大汇总列表(持续更新中...)

激活函数大汇总列表&#xff08;持续更新中…&#xff09; 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不可或缺的角色&#xff0c;它们决定着神经元的输出&#xff0c;并且影响着网络的学习能力与表现力…

Redirect相应重定向无法访问WEB-INF下的静态资源,可以跳到外部资源(比如www.baidu.com)

相应重定向无法访问WEB-INF目录下静态资源&#xff0c;WEB-INF目录下静态资源受保护。 访问外部资源 访问Servlet5.do&#xff0c;就跳到百度页面