大数据开发中级练习题目(python超详细)

news2025/1/12 16:11:15
  1. 给定长度为m的非重复数组p,以及从其中取n(n<m)个数字组成新的子数组q。现要对p进行排序,要求:q在数组的最前方,其余数字按从小到大的顺序依次排在后面

输入样例:

q = [3, 5, 4]

p = [5, 4, 3, 2, 1]

输出样例:

3 5 4 1 2

代码如下:

q = [3, 5, 4]
p = [5, 4, 3, 2, 1]

# 对 p 中的数字进行排序
sorted_p = sorted(p)

# 创建一个空的列表(数组)result
result = []
# 先把q中的数字依次放入result
for ele in q:
    result.append(ele)

# 遍历一下排好序的p,也即sorted_p, 将sorted_p 中不在q中的元素依次放到result
for num in sorted_p:
    if num not in q:
        result.append(num)

# 最后,输出结果
print(result)

运行结果:

2、

  1. 给定小写英文字符串a和一个非负数b(0<=b<26), 将a中的每个小写字符替换成字母表中比它大b的字母。这里将字母表的z和a相连,如果超过了z就回到了a。

输入样例:

a = "dfjkldfdfdl"

b = 5

输出示例:

ikopqikikiq

 代码如下:

a = "dfjkldfdfdl" 
b = 5

# 定义一个空的字符串,用于保存结果
result = ""

# 遍历a中的每个字符,并对其加5
for letter in a:
    # 计算出字母表中比letter大b(这里是5)的字符
    # 首先我们要得到 ascii码(使用ord函数)
    letter_new_code = (ord(letter) - ord('a') + b) % 26 + ord('a')
    # 然后我们将 ascii 码转为字母(使用chr函数)
    letter_new = chr(letter_new_code)

    result += letter_new

# 打印结果   
print(result)

运行结果:

3. 给定整数a,计算a在二进制表示下1的个数,并输出。

输入样例:

a = 39

输出样例:

4

代码如下:

a = 39

# 定义一个计数器,来统计1的个数
counter = 0 

# 遍历 a 的二进制表示中的每一位
for i in range(128):
    # 使用位运算符 & 来监测第i位是否为1
    if a & (1 << i) != 0:
        # 说明第i位上a有1, 那么计数器加1
        counter += 1

# 输出结果
print(counter)

运行结果:

4. 克拉兹猜想:任取一正整数(大于2),如果是偶数,将其除以2。如果是奇数,将其乘以3再加1,然后重复这个过程,最后结果都会陷入4 2 1 的循环。

请通过编程实现,当4,2,1重复第二次的时候,结束循环,并打印整数为16时的输出列表。(编写完程序后,讲数值未16的后续打印出来)

输入样例:

a = 19

输出样例:

19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1

代码如下:

# 定义一个克拉兹猜想(数学家杀手)的函数
def collaz_conjecture(a):
    # 定义一个输出的列表,来保存“线路”
    result = []

    while True:
        # 如果是偶数: 除以2
        if a % 2 == 0:
            a = a // 2
        # 如果是奇数: 乘3再加1
        else:
            a = 3 * a + 1
        
        # 将每次运算的记录保存起来
        result.append(a)

        # 停止循环:只要出现了两次1(相当于是出现了两次4-2-1),我们就停止循环
        if a == 1 and result.count(1) == 2:
            break

    # 返回输出列表
    return result

# 最后,调用函数, 并打印结果
result = collaz_conjecture(39)
idx = result.index(19)
print(result[idx:]) 

运行结果:

5.  罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。

X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。

C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字,编程将其转换成整数。

输入样例:

III

输出样例:

3

代码如下:

# 定义一个字典,用于保存罗马数字和整数的映射关系
romans = {
    "I": 1,
    "V": 5,
    "X": 10,
    "L": 50,
    "C": 100,
    "D": 500,
    "M": 1000,
}

# 定义一个函数,将罗马数字转换成整数
def roman_to_integer(roman):
    # 初始化整数0
    result = 0

    # 遍历一下罗马数字的每一位,再根据映射关系来求和
    for i in range(len(roman)):
        # 获取当前罗马数字及其下一个罗马数字
        current = romans[roman[i]]
        if i < len(roman) -1:
            next = romans[roman[i+1]]
        else:
            next = 0

        # 如果当前罗马数字比下一个罗马数字大,则加上当前的数字;
        # 否则就减去当前的数字
        if current >= next:
            result += current
        else:
            result -= current

    # 返回结果
    return result

# 测试代码
print(roman_to_integer("MCMXCIII"))
print(roman_to_integer("MMXXII"))
print(roman_to_integer("IV"))
print(roman_to_integer("IX"))

运行结果:

6. 给定一个链表,请在不修改节点内部值的情况下,两两交换其中相邻的节点,并返回交换后链表的头节点,例如:

原链表转换为列表:[1, 2, 3, 4]

最终的链表转换为列表:[2, 1, 4, 3]

原链表转换为列表:[1, 2, 3, 4, 5]

最终的链表转换为列表:[2, 1, 4, 3, 5]

原链表转换为列表:[]

最终的链表转换为列表:[]

已知 链表节点的定义代码如下,请实现交换过程,并打印[1, 2, 3, 4]交换后的结果:

class ListNode:

    def __init__(self,val,next=None):

        if isinstance(val,int):

            self.val = val

            self.next = next

        elif isinstance(val,list):

            self.val = val[0]

            self.next = None

            head = self

            for i in range(1,len(val)):

                node = ListNode(val[i])

                head.next = node

                head = head.next

代码如下:

class ListNode:
    def __init__(self,val,next=None):
        if isinstance(val,int):
            self.val = val
            self.next = next
        elif isinstance(val,list):
            self.val = val[0]
            self.next = None
            head = self
            for i in range(1,len(val)):
                node = ListNode(val[i])
                head.next = node
                head = head.next

# 定义链表(示例化ListNode类)
list_node = ListNode([1, 2, 3, 4])

# 定义一个函数,来实现两两交换的功能 -- 递归函数
def swap_pairs(head):
    # 如果链表为空或者只有一个节点,那么就无需交换
    if head is None or head.next is None:
        return head
    
    # 交换头节点和下一个节点
    temp = head.next 
    head.next = temp.next
    temp.next = head 

    # 以递归的方式交换后面其余的节点
    head.next = swap_pairs(head.next)

    # 返回交换后的头节点
    return temp

# 打印交换后的链表
head = swap_pairs(list_node)
while head is not None:
    print(head.val)
    head = head.next

运行结果:

7. 给定一个字符串,请从这个字符串中找出所有最长的没有重复字符的子串,并返回最长不重复子串的长度,例如:

字符串:asdfwedferrf ==> 最长不重复子串:asdfwe,长度6

字符串:wpwswekedw ==> 最长不重复子串:swek, kedw,长度4
代码如下:

def lengthOfLongestSubstring(string):
    # 定义一个字典,用于存储输入字符串string中每个字符最后出现的位置
    last_idx = {}
    max_len = 0 # 初始化最大长度

    # 定义一个指针, 表示当前不重复子串的开头位置
    start_idx = 0

    for i in range(len(string)):
        # 跟新 当前窗口的开头 start_idx为:
        #   start_idx 和 last_idx[string[i]] + 1 中的最大值
        if string[i] in last_idx: # 判断一下当前字符是否是已经在前面出现过,
                                  # 如果出现过(出现重复的字符),则跟新start_idx
            start_idx = max(start_idx, last_idx[string[i]] + 1)

        # 跟新max_len
        max_len = max(max_len, i - start_idx + 1)

        # 跟新当前字符最后出现的位置
        last_idx[string[i]] = i

    return max_len

# 调用函数, 打印测试结果
print(lengthOfLongestSubstring("asdfwedferrf "))
print(lengthOfLongestSubstring("wpwswekedw"))

 运行结果:

8.请设计一个单链表,单链表中的节点应该具有两个属性:val 和 next,val 是当前节点的值,next 是指向下一个节点的指针或引用,并在链表类中实现下列操作:

get(index):获取链表中索引 index 节点的值。如果索引无效,则返回-1。

add_at_head(val):在链表的第一个节点之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。

add_at_tail(val):将值为 val 的节点追加到链表的最后一个节点。

add_at_index(index,val):在链表中的索引 index 节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将追加到链表的末尾;如果 index 大于链表长度,则不会插入节点;如果 index 小于0,则在头部插入节点。

delete_at_index(index):如果索引 index 有效,则删除链表中的索引 index 的节点。

说明:链表节点的索引 index 是从 0 开始计算,比如链表中索引 1 下的节点,指的是链表中的第二个节点。

# 先定义节点的类
class Node:
    def __init__(self, val, next=None):
        self.val = val
        self.next = next

# 定义单链表的类
class SingleLinkedList:
    def __init__(self,head=None):
        self.head = head

    def get(self, index):
        curr = self.head 
        for i in range(index):
            if not curr:
                return -1 # 按照题目要求这里是-1
            curr = curr.next
        return curr.val if curr else -1 # 按照题目要求这里是-1

    def add_at_head(self, val):
        self.head = Node(val, next=self.head)

    def add_at_tail(self, val):
        curr = self.head 
        if not curr:
            self.head = Node(val)
            return 
        while curr.next:
            curr = curr.next  
        curr.next =  Node(val)

    def add_at_index(self, index, val):
        if index == 0:
            self.add_at_head(val)
            return
        curr = self.head 
        for i in range(index-1):
            if not curr:
                print('index 超过范围,请选用更小的index')
                return 
            curr = curr.next
        # 循环已结束,抵达指定位置
        curr.next = Node(val, curr.next)
        

    def delete_at_index(self, index):
        curr = self.head
        if index == 0:
            self.head = self.head.next
            return 
        for i in range(index -1):
            if not curr:
                print('index 超过范围,请选用更小的index')
                return 
            curr = curr.next 
        # 循环已结束,抵达指定位置
        if curr.next:
            curr.next = curr.next.next

# 测试
linked_list = SingleLinkedList()
linked_list.add_at_head(0)
linked_list.add_at_head(0)
linked_list.add_at_tail(1)
linked_list.add_at_index(1,9)
linked_list.delete_at_index(2)

# 打印链表
head = linked_list.head
while head is not None:
    print(head.val)
    head = head.next

# 测试 get 函数
idx = 3
print("index = {}, val = ".format(idx),linked_list.get(idx))

        

运行结果:

9.给定N个不同的数A[0,...,N-1]以及某定值sum,找到这个N个数中的两个数,使得他们的和为sum,要求时间复杂度为O(N)。

    实现此查找函数,并使用参数验证,如:N=[12,35,4,7,9,13,19,43,27,61,32],

    sum=65。

思路步骤

将数组N进行排序,从小到大的顺序 N_sorted

初始化两个位置(指针),分别指向数组N_sorted的首和尾,

如果两个指针的和小于sum: 将左边的指针往右移动一格

如果两个指针的和大于sum: 将右边的指针往左移动一格

如果两个指针的等于sum:保存下来两个指针的位置信息

代码如下:

def solution(N,S):
    N_sorted = sorted(N) # 从小到大对列表进行排序
    leftIdx = 0  # 初始化左边指针的索引:初始时刻指向最左边
    rightIdx = len(N) -1  # 初始化右边指针的索引:初始时刻指向最右边
    result = [] #一个空的列表,用来保存结果

    while leftIdx < rightIdx: # 从两端进行遍历,如果左边的指针和右边的指针相遇,则停止循环
        if N_sorted[leftIdx] + N_sorted[rightIdx] == S:
            result.append((N_sorted[leftIdx], N_sorted[rightIdx])) # 满足条件,保存结果
            # 更新一下指针
            leftIdx += 1 # 左边指针右移一格
            rightIdx -= 1 # 右边指针左移一格
        elif N_sorted[leftIdx] + N_sorted[rightIdx] > S:
            rightIdx -= 1 # 右边指针左移一格, 使的两个数的和变小
        else:
            leftIdx += 1 # 左边指针右移一格, 使的两个数的和变大
    return result # 返回结果

N = [12,33,4,7,9,13,19,43,27,61,32]
S = 65
print(solution(N,S))
# 结果应该是:(33,32), (4,61)

 运行结果:

10.给定一个文本列表sentences,它包含n个语句,再任意给出一个关键词keywords列表,包含m个关键词,请使用倒排索引的思想实现一个算法,返回包含所有关键词的句子。

    请使用下面的参数验证。

    sentences = ['This is the first word',

    'This is the second word',

    'This is the third word']

keywords = ['This', 'second ']

代码如下:

def solution(sentences,keywords):
    # 第一步:遍历所有的句子,得到词汇集
    word_set = set() # 一个空的集合,来保存所有的单词
    for sentence in sentences: # 遍历所有句子
        words = sentence.lower().strip().split() # 得到当前句子的单词,结果是列表
        for word in words:
            word_set.add(word) # 把每个出现的单词都加到单词集合里面去,重复的会自动去重
    
    # 第二步: 构建倒排索引的字典(原理可以参考一下维基百科或者百度百科)
    word_index_dict = {} # 初始化一个空的字典
    for word in word_set:
        word_index_dict[word] = set() # 初始化当前单词对应的值key为一个空的集合
        for i in range(len(sentences)): # 遍历一下所有的句子,看看当前词都在哪个句子里出现过
            if word in sentences[i].lower(): # 如果单词在第i个句子里面出现过
                word_index_dict[word].add(i) # 那就把句子索引i加入到word对应的集合里

    # 第三步,通过集合的交集运算,去查找同时出现keywords所有单词的句子。
    keywords = [word.strip().lower() for word in keywords] # 预处理:把关键词变为小写,并且去除不必要的空格
    sets = [] # 把keywords里面所有单词对应的集合(上一步得到的word_index_dict里面的值)保存起来
    for keyword in keywords: # 遍历所有的关键词
        sets.append(word_index_dict[keyword]) # 把每个词对应的集合放到sets列表里
    # 最后,求交集
    intersection_sets = set.intersection(*sets) # 求交集,得到的是同时出现keywords的句子的索引
    # 将索引还原为句子
    result = [sentences[idx] for idx in intersection_sets] # (索引还原)结果为句子

    return result

sentences = ['This is the first word','This is the second word','This is the third word']
keywords = ['This', 'second ']
print(solution(sentences,keywords))

运行结果:

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

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

相关文章

37. 解数独

37. 解数独 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff…

SAP 财务年结操作宝典

目录 一 、后台操作篇 1.1 维护会计凭证编号范围 2.2 维护CO版本 1.3 维护利润中心版本 1.4 维护物料分类账文档的编号范围 (如 1.5 复制合并凭证编号范围(如果公司没有这个业务的) 1.6 维护发票凭证的编号范围间隔 (如果不针对年度则不用维护) 1.7 维护发票凭证的编号范…

MCU-51:单片机串口详解

目录一、计算机通信简介二、串口通信简介2.1 同步通信2.2 异步通信三、串行通信的传输方式四、串口通信硬件电路五、常见接口介绍六、串口相关寄存器详解6.1 特殊功能寄存器SCON6.2 PCON寄存器6.3 TMOD寄存器七、代码演示-单片机和电脑通信7.1 串口向电脑发送数据7.2 电脑通过串…

YOLO-V5 算法和代码解析系列(二)—— 【train.py】核心内容

文章目录调试设置整体结构代码解析ModelTrainloader分布式训练FreezeOptimizerSchedulerEMA调试设置 调试平台&#xff1a;Ubuntu&#xff0c;VSCode 调试设置&#xff0c;打开【/home/slam/kxh-1/2DDection/yolov5/.vscode/launch.json】&#xff0c;操作如下图所示&#xff…

GNN基础知识

1. 泰勒公式 背景background 有一个很复杂的方程&#xff0c;我们直接计算方程本身的值可能非常麻烦。 所以我们希望能够找到一个近似的方法来获得一个足够近似的值 本质&#xff1a; 近似&#xff0c;求一个函数的近似值 one point is 近似的方法another point is 近似的…

【Java 数据结构】-优先级队列以及Java对象的比较

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Java 数据结构】 分享&#xff1a;美妙人生的关键在于你能迷上什么东西。——《球状闪电》 主要内容&#xff1a;优先级队列底层的堆&#xff0c;大堆的创建&#xff0c;插入&a…

Openssl 生成自签名证书

最近在调试Ingress需要使用多份证书&#xff0c;对证书的生成和使用做了简单的整理。 不用翻垃圾桶一条过 #!/bin/sh output_dir"/opt/suops/k8s/ingress-files/certs/fanht-create-ssl/" read -p "Enter your domain [www.example.com]: " DOMAIN echo…

C++11特性-线程

并发 一个程序执行多个独立任务&#xff0c;提高性能 单核cpu是通过(任务切换)&#xff0c;即上下文切换&#xff0c;有时间开销 多核cpu(当核数>任务数)&#xff0c;硬件并发 进程 运行起来的一个可执行程序&#xff08;一段程序的运行过程&#xff09; 资源分配的最小单…

百数应用中心上新了——餐饮门店管理系统

随着智能化时代的来临&#xff0c;传统的餐饮门店管理方式逐渐暴露出缺陷。不少餐饮业的掌门人都纷纷对管理方式进行了转型&#xff0c;由传统模式转变为数字化系统的管理。然而数字化管理方式也没那么容易进行&#xff0c;想要百分百满足需求的系统耗时耗力耗钱&#xff0c;成…

不懂PO 设计模式?这篇实战文带你搞定 PO

1080442 73.1 KB 为UI页面写测试用例时&#xff08;比如web页面&#xff0c;移动端页面&#xff09;&#xff0c;测试用例会存在大量元素和操作细节。当UI变化时&#xff0c;测试用例也要跟着变化&#xff0c; PageObject 很好的解决了这个问题&#xff01; 使用UI自动化测试工…

钉钉 ANR 治理最佳实践 | 定位 ANR 不再雾里看花

作者&#xff1a;姜凡(步定) 本文为《钉钉 ANR 治理最佳实践》系列文章首篇《定位 ANR 不再雾里看花》&#xff0c;主要介绍了钉钉自研的 ANRCanary 通过监控主线程的执行情况&#xff0c;为定位 ANR 问题提供更加丰富的信息。 后续将在第二篇文章中讲述钉钉基于分析算法得出 …

【TuyaOS开发之旅】BK7231N GPIO的简单使用

接口讲解 GPIO初始化 /*** brief gpio 初始化* * param[in] pin_id: 需要初始化的GPIO编号&#xff0c; 对应TUYA_GPIO_NUM_E枚举* param[in] cfg: gpio 配置** return OPRT_OK on success. Others on error, please refer to tuya_error_code.h*/ OPERATE_RET tkl_gpio_ini…

基于SpringBoot工程开发Docker化微服务

目录 1. 微服务容器化治理的优缺点 1.1 微服务容器化的优点 1.2 微服务容器化的缺点 2. 微服务的两种模式 2.1 Microservice SDK 2.2 ServiceMesh 3. 微服务容器化治理的推荐模式 4.Windows下开发容器化微服务&#xff08;非K8S&#xff09; 4.1 开发环境 4.2 代码框架…

全网最新、最详细的使用burpsuite验证码识别绕过爆破教程(2023最新)

1、前沿 最近一直在研究绕过验证码进行爆破的方法&#xff0c;在这里对自己这段时间以来的收获进行一下分享。在这里要分享的绕过验证码爆破的方法一共有2个&#xff0c;分为免费版本&#xff08;如果验证码比较奇怪可能会有识别错误的情况&#xff09;和付费版本&#xff08;…

【Qt】QtCreator远程部署、调试程序

1、添加远程设备 1)QtCreator 工具–> 选项 --> 设备 --> 添加 2)设备设置向导选择–> Generic Linux Device --> 开启向导 3)填写“标识配置的名称”(随便写)、设备IP、用户名 --> 下一步 4)选择配对秘密文件,第一次配对,可以不填写,点击“下一…

嵌入式:ARM嵌入式系统开发流程概述

文章目录嵌入式开发的具体过程开发流程图嵌入式软件开发环境交叉开发环境远程调试结构图嵌入式应用软件开发的基本流程软件模拟环境目标板与评估板嵌入式软件开发的可移植性和可重用性嵌入式开发的具体过程 系统定义与需求分析阶段方案设计阶段详细设计阶段软硬件集成测试阶段…

Tomcat架构分析—— Engine

文章目录一、Tomcat的核心模块&#xff08;核心组件&#xff09;二、Engine 组件1.核心类与依赖图2.核心类源码分析构造函数&#xff1a;初始化方法 init&#xff1a;启动方法 start&#xff1a;3.Engine的启动过程总结一、Tomcat的核心模块&#xff08;核心组件&#xff09; …

机器学习之支持向量机(手推公式版)

文章目录前言1. 间隔与支持向量2. 函数方程描述3. 参数求解3.1 拉格朗日乘数3.2 拉格朗日对偶函数前言 支持向量机(Support(Support(Support VectorVectorVector Machine,SVM)Machine,SVM)Machine,SVM)源于统计学习理论&#xff0c;是一种二分类模型&#xff0c;是机器学习中获…

mysql查询当天,近一周,近一个月,近一年的数据

1.mysql查询当天的数据 select * from table where to_days(时间字段) to_days(now()); 2.mysql查询昨天的数据 select * from table where to_days(now( ) ) - to_days( 时间字段名) < 1 3.mysql查询近一周的数据 SELECT * FROM table WHERE date(时间字段) > D…

MySQL表的创建修改删除

目录 1、表的创建 2、查看表结构 3、表的修改 4、表的删除 1、表的创建 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎&#xff1b;说明&#xff1a; field 表示列名 datatype 表…