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

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

在这里插入图片描述

二、

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

叶子分享站PHP源码

叶子网盘分享站PHP网站源码&#xff0c;创建无限级文件夹&#xff0c;上传文件&#xff0c;可进行删除&#xff0c;下载等能很好的兼容服务器。方便管理者操作&#xff0c;查看更多的下载资源以及文章&#xff0c;新增分享功能&#xff0c;异步上传文件/资源等 PHP网盘源码优势…

VUE内盘期货配资软件源码国际外盘二合一

开发一个Vue内盘期货配资软件源码&#xff0c;同时兼容国际外盘二合一的功能&#xff0c;是一个复杂且专业的任务&#xff0c;涉及前端Vue.js框架的使用、后端服务器处理、数据库管理、实时交易接口对接等多个方面。下面是一些关于开发此类软件的基本指导和考虑因素&#xff1a…

Docker拉取镜像存储不足

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

Diffusion 公式和代码解读

1、训练过程 下面就是代码实现过程 2、训练过程的损失函数。也就是上面的公式。 二、采样过程&#xff0c;生成过程&#xff1a;

BufferWriter类解析

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

【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 | 所有的模…

基于恒功率PQ控制的三电平并网逆变器MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 三相 T 型三电平逆变器电路如图所示&#xff0c;逆变器主回路由三个单相 T 型逆变器组成。 直流侧输入电压为 UPV&#xff0c;直流侧中点电位 O 设为零电位&#xff0c;交流侧输出侧是三相三线制连…

《互联网的世界》第七讲-能源

本想聊聊 tcp 和 quic&#xff0c;但这些都属于术的范畴&#xff0c;变化多端&#xff0c;等孩子们长大了又不知变成什么样子了&#xff0c;趁这段时间在家&#xff0c;还是得讲一些相对不变的东西&#xff0c;或法或势。 从 安阳卖血糕的精巧篦子 想到如何做圆米粉和圆面条&a…

[ThinkPHP]Arr返回1

$detailId (int)Arr::get($detail, null); var_dump($detailId); 打印结果&#xff1a;int(1) 原因&#xff1a; vendor/topthink/think-helper/src/helper/Arr.php

Python使用openpyxl库或pandas库创建.xlsx格式的Excel文件,并向文件不同的sheet按行或按列写入内容

import openpyxl# 创建-一个Workbook对象 wb openpyxl.Workbook()# 创建多个工作表 sheet1 wb.active sheet1.title "s1"sheet2 wb.create_sheet("s2")# 在不同的工作表中写入数据 sheet1["A1"] Data for Sheet1 sheet1["A2"] D…

一.java介绍和idea基础使用

java技术体系 Java技术体系说明Java SE(Java standard Edition):标准版Java技术的核心和基础Java EE(Java Enterprise Edition):企业版企业级应用开发的一套解决方案Java ME(Java Micro Edition):小型版针对移动设备应用的解决方案&#xff08;认可少&#xff0c;主要是安卓和…

Netty线程模型详解

文章目录 概述单Reactor单线程模型单Reactor多线程模型主从Reactor多线程模型 概述 Netty的线程模型采用了Reactor模式&#xff0c;即一个或多个EventLoop轮询各自的任务队列&#xff0c;当发现有任务时&#xff0c;就处理它们。Netty支持单线程模型、多线程模型和混合线程模型…

彩虹知识付费模板MangoA全开源包含秒杀/抽奖/社群/推送等功能

二次开发增加以下功能每日秒杀每日签到官方社群多级分销在线抽奖项目投稿 每日秒杀 每日签到 官方社群 多级分销 在线抽奖 项目投稿 下载地址&#xff1a;https://pan.xunlei.com/s/VNstMfOecGliiqew7UIorsOnA1?pwdhywi#

Flink 的时间属性及原理解析

Flink的API大体上可以划分为三个层次&#xff1a;处于最底层的ProcessFunction、中间一层的DataStream API和最上层的SQL/Table API&#xff0c;这三层中的每一层都非常依赖于时间属性。时间在Flink中的地位如下图所示&#xff1a; 时间属性是流处理中最重要的一个方面&#…

cms垃圾回收

cms垃圾回收 CMS概述CMS收集器整体流程初始标记并发标记重新标记并发清除 CMS卡表什么是卡表(card table)什么是mod-union table CMS概述 CMS(Concurrent Mark Sweep)收集器是Java虚拟机中的一种老年代(old Generation)垃圾收集器&#xff0c;他主要目标是减少垃圾收集时的应用…

数据库基础知识超详细解析~‍(进阶/复习版)

文章目录 前言一、数据库的操作1.登入数据库2.创建数据库3.显示当前数据库4.使用数据库5.删除数据库 二、常用数据类型三、数据库的约束1约束类型2NULL约束3UNIQUE:唯一约束4DEFAULT&#xff1a;默认值约束5 PRIMARY KEY&#xff1a;主键约束6 FOREIGN KEY&#xff1a;外键约束…

STM32第十课:串口发送

一、usart串口 1.1 USART串口协议 串口通讯(Serial Communication) 是一种设备间非常常用的串行通讯方式&#xff0c;因为它简单便捷&#xff0c;因此大部分电子设备都支持该通讯方式&#xff0c;电子工程师在调试设备时也经常使用该通讯方式输出调试信息。在计算机科学里&…

2024年云仓酒庄:店中店增项新模式,开启葡萄酒文化新篇章

2024云仓酒庄&#xff1a;店中店增项新模式&#xff0c;开启葡萄酒文化新篇章 在葡萄酒行业蓬勃发展的今天&#xff0c;云仓酒庄以其独特的经营模式和创新思维&#xff0c;在市场中脱颖而出。2024年&#xff0c;云仓酒庄继续深化其战略布局&#xff0c;不仅在多地开设酒庄实体…

【论文笔记合集】Transformers in Time Series A Survey综述总结

本文作者&#xff1a; slience_me 文章目录 Transformers in Time Series A Survey综述总结1 Introduction2 Transformer的组成Preliminaries of the Transformer2.1 Vanilla Transformer2.2 输入编码和位置编码 Input Encoding and Positional Encoding绝对位置编码 Absolute …

Redis到底是单线程还是多线程!,【工作感悟】

无论你是做 Python&#xff0c;PHP&#xff0c;JAVA&#xff0c;Go 还是 C#&#xff0c;Ruby 开发的&#xff0c;都离不开使用 Redis。 大部分程序员同学工作中都有用到 Redis&#xff0c;但是只限于会简单的使用&#xff0c;对Redis缺乏整体的认知。 无论是在大厂还是在中小…