CSDN每日一题学习训练——Python版(N皇后 II、买卖股票的最佳时机 II、编程通过键盘输入每一位运动员)

版本说明

当前版本号[20231120]。

版本修改说明
20231120初版

目录

文章目录

  • 版本说明
  • 目录
  • N皇后 II
    • 题目
    • 解题思路
    • 代码思路
    • 参考代码
  • 买卖股票的最佳时机 II
    • 题目
    • 解题思路
    • 代码思路
    • 参考代码
  • 编程通过键盘输入每一位运动员
    • 题目
    • 解题思路
    • 代码思路
    • 参考代码

N皇后 II

题目

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。

示例 1:

image-20231120205216429

输入:n = 4
输出:2
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:1

提示:

1 <= n <= 9
皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

以下程序实现了这一功能,请你填补空白处内容:

class Solution(object):
	def __init__(self):
		self.count = 0
	def totalNQueens(self, n):
		self.dfs(0, n, 0, 0, 0)
		return self.count
	def dfs(self, row, n, column, diag, antiDiag):
		if row == n:
			self.count += 1
			return
		for index in range(n):
			isColSafe = (1 << index) & column == 0
			isDigSafe = (1 << (n - 1 + row - index)) & diag == 0
			isAntiDiagSafe = (1 << (row + index)) & antiDiag == 0
			if isAntiDiagSafe and isColSafe and isDigSafe:
				_________________________;
if __name__ == '__main__':
	s = Solution()
	print (s.totalNQueens(4))

解题思路

  1. 初始化一个计数器 count,用于记录解决方案的数量。
  2. 定义一个深度优先搜索函数 dfs,用于寻找 n 皇后问题的解决方案。
  3. 在 dfs 函数中,使用递归的方式进行深度优先搜索。
  4. 对于每一行,遍历每一列,检查当前位置是否安全(即没有其他皇后在同一行、同一列或同一对角线上)。
  5. 如果当前位置安全,继续搜索下一行,并更新 column、diag 和 antiDiag 的值。
  6. 如果已经放置了 n 个皇后,找到一个解决方案,增加计数器 count 的值。
  7. 返回计数器 count 的值作为解决方案数量。

代码思路

  1. 定义一个名为Solution的类,包含一个初始化方法__init__和一个计算解决方案数量的方法totalNQueens。

  2. 在初始化方法中,将计数器count初始化为0。

    class Solution(object):
        def __init__(self):
            self.count = 0  # 初始化计数器为0
    
  3. 在totalNQueens方法中,调用深度优先搜索函数dfs,传入初始参数row=0, n=棋盘大小, column=0, diag=0, antiDiag=0。

        def totalNQueens(self, n):
            """
            计算n皇后问题的解决方案数量
            :param n: 棋盘大小
            :return: 解决方案数量
            """
            self.dfs(0, n, 0, 0, 0)  # 从第0行开始深度优先搜索
            return self.count  # 返回解决方案数量
    
  4. 在dfs函数中,使用递归的方式进行深度优先搜索。

     def dfs(self, row, n, column, diag, antiDiag):
            """
            深度优先搜索函数,用于寻找n皇后问题的解决方案
            :param row: 当前行数
            :param n: 棋盘大小
            :param column: 列掩码,表示已经放置的皇后所在的列
            :param diag: 主对角线掩码,表示已经放置的皇后所在的主对角线
            :param antiDiag: 副对角线掩码,表示已经放置的皇后所在的副对角线
            """
    
  5. 如果已经放置了n个皇后,找到一个解决方案,增加计数器self.count的值。

       if row == n:  # 如果已经放置了n个皇后,找到一个解决方案
                self.count += 1  # 增加解决方案计数器
                return
    
  6. 遍历每一列,检查当前位置是否安全(即没有其他皇后在同一行、同一列或同一对角线上)。

       for index in range(n):  # 遍历每一列
    
  7. 如果当前位置安全,继续搜索下一行,更新column、diag和antiDiag的值。

  8. 最后,返回计数器self.count的值作为解决方案的数量。

     isColSafe = (1 << index) & column == 0  # 检查当前列是否安全
                isDigSafe = (1 << (n - 1 + row - index)) & diag == 0  # 检查主对角线是否安全
                isAntiDiagSafe = (1 << (row + index)) & antiDiag == 0  # 检查副对角线是否安全
                if isAntiDiagSafe and isColSafe and isDigSafe:  # 如果当前位置安全,继续搜索下一行
                    self.dfs(row + 1, n, (1 << index) | column, (1 << (n - 1 + row - index)) | diag, (1 << (row + index)) | antiDiag)
    
  9. 在主程序中,创建一个Solution对象s,并调用totalNQueens方法,传入棋盘大小n=4,输出4皇后问题的解决方案数量。

if __name__ == '__main__':
    s = Solution()  # 创建Solution对象
    print(s.totalNQueens(4))  # 输出4皇后问题的解决方案数量

参考代码

这段代码是使用深度优先搜索算法来寻找所有可能的解决方案,并返回解决方案的数量。

self.dfs(row + 1,  n, (1 << index) | column,
        (1 << (n - 1 + row - index)) | diag,
        (1 << (row + index)) | antiDiag)

买卖股票的最佳时机 II

题目

给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: prices = [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

示例 2:

输入: prices = [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

输入: prices = [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:

1 <= prices.length <= 3 * 104
0 <= prices[i] <= 104

解题思路

  1. 初始化两个变量,hold表示持有股票的标志,0表示不持有,1表示持有;pric用于记录买入和卖出的价格;temp用于记录每次交易的利润;flag表示买入价格的索引;msum表示最大利润。
  2. 如果价格列表长度小于等于2,直接计算最大利润。如果价格列表为空,返回0;如果只有一个价格,返回0;如果第一个价格大于第二个价格,返回0;如果第一个价格小于第二个价格,返回第二个价格减去第一个价格。
  3. 遍历价格列表,找到买入和卖出的价格。如果下一个价格大于当前价格且不持有股票,将持有标志设为1,记录买入价格的索引,继续遍历;如果下一个价格小于当前价格且持有股票,将买入和卖出的价格分别添加到pric列表中,将持有标志设为0,继续遍历;否则,继续遍历。
  4. 计算每次交易的利润,并更新最大利润。遍历pric列表,每次取相邻的两个元素作为买入和卖出价格,计算利润,并将利润添加到temp列表中。然后更新最大利润msum为temp列表中所有元素的和。
  5. 如果最后还持有股票,将最后一天的价格加入最大利润。计算最后一天与买入价格之间的差值,加到最大利润msum上。
  6. 返回最大利润msum。

代码思路

  1. 定义一个类Solution,包含一个方法maxProfit,接收一个参数prices,表示股票价格的列表。

  2. 初始化变量hold为0,表示持有股票的标志;pric为空列表,用于记录买入和卖出的价格;temp为空列表,用于记录每次交易的利润;flag为0,表示买入价格的索引;msum为0,表示最大利润。

    	hold = 0  # 持有股票的标志,0表示不持有,1表示持有
            pric = []  # 记录买入和卖出的价格
            temp = []  # 记录每次交易的利润
            flag = 0  # 记录买入价格的索引
            msum = 0  # 记录最大利润
    
  3. 如果价格列表长度小于等于2,直接计算最大利润。如果价格列表为空,返回0;如果只有一个价格,返回0;如果第一个价格大于第二个价格,返回0;如果第一个价格小于第二个价格,返回第二个价格减去第一个价格。

      # 如果价格列表长度小于等于2,直接计算最大利润
            if len(prices) <= 2:
                if not prices:
                    return 0
                if len(prices) == 1:
                    return 0
                if prices[0] > prices[1]:
                    return 0
                if prices[0] < prices[1]:
                    return prices[1] - prices[0]
    
  4. 遍历价格列表,找到买入和卖出的价格。如果下一个价格大于当前价格且不持有股票,将持有标志设为1,记录买入价格的索引;如果下一个价格小于当前价格且持有股票,将买入和卖出的价格分别添加到pric列表中,并将持有标志设为0。

      # 遍历价格列表,找到买入和卖出的价格
            for i in range(len(prices) - 1):
                if prices[i + 1] > prices[i] and hold != 1:
                    hold = 1
                    flag = i
                    continue
                if prices[i + 1] < prices[i] and hold == 1:
                    pric.append(prices[flag])
                    pric.append(prices[i])
                    hold = 0
                else:
                    continue
    
  5. 计算每次交易的利润,将每次交易的利润添加到temp列表中,并更新最大利润。

    # 计算每次交易的利润,并更新最大利润
            for i in range(0, len(pric), 2):
                temp.append(pric[i + 1] - pric[i])
                msum = sum(temp)
    
  6. 如果最后还持有股票,将最后一天的价格加入最大利润。

      # 如果最后还持有股票,将最后一天的价格加入最大利润
            if hold == 1:
                msum = msum + prices[-1] - prices[flag]
    
  7. 返回最大利润。

参考代码

这段代码是一个股票交易问题的解法,通过遍历价格列表来找到买入和卖出的价格,并计算每次交易的利润。

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        hold = 0
        pric = []
        temp = []
        flag = 0
        msum = 0
        if len(prices) <= 2:
            if not prices:
                return 0
            if len(prices) == 1:
                return 0
            if prices[0] > prices[1]:
                return 0
            if prices[0] < prices[1]:
                return prices[1] - prices[0]
        for i in range(len(prices) - 1):
            if prices[i + 1] > prices[i] and hold != 1:
                hold = 1
                flag = i
                continue
            if prices[i + 1] < prices[i] and hold == 1:
                pric.append(prices[flag])
                pric.append(prices[i])
                hold = 0
            else:
                continue
        for i in range(0, len(pric), 2):
            temp.append(pric[i + 1] - pric[i])
            msum = sum(temp)
        if hold == 1:
            msum = msum + prices[-1] - prices[flag]
        return msum

编程通过键盘输入每一位运动员

题目

体操比赛成绩统计。多名运动员,多个评委打分,去掉一个最高分和去掉一个最低分,对其余分数求平均分作为一个运动员成绩。 编程通过键盘输入每位运动员编号和每个评委的成绩,求出运动员的最终成绩,并将运动员编号和最终成绩保存在一个字典中,形如{编号1:最终成绩1,学号2:最终成绩2…,并将结果输出。

解题思路

  1. 首先,我们需要获取评委人数和学生人数,确保评委人数不少于3人,学生人数不少于1人。
  2. 然后,我们需要初始化一个空的学生列表,用于存储每个学生的相关信息。
  3. 接下来,我们需要遍历学生人数,对于每个学生,我们需要初始化一个包含评分列表、学号、最低分、最高分和平均分的字典。
  4. 在每个学生字典中,我们需要输入学生的学号,并遍历评委人数,获取每个评委的评分,并将其添加到评分列表中。
  5. 对评分列表进行排序,然后去掉最低分和最高分,计算剩余分数的平均分,并将结果更新到学生字典中。
  6. 将学生字典添加到学生列表中。
  7. 使用字典推导式生成学生学号和最终成绩的字典。
  8. 最后,输出结果。

代码思路

  1. 首先,通过输入获取评委人数和学生人数。

  2. 然后,初始化一个空的学生列表。

    # 输入评委人数,不得少于3人
    t = int(input('请输入评委人数(不得少于3人):'))
    
    # 输入学生人数,不得少于1人
    s = int(input('请输入学生人数(不得少于1人):'))
    
    # 初始化学生列表
    stus = []
    
  3. 接着,遍历学生人数,对于每个学生,初始化一个包含评分列表、学号、最低分、最高分和平均分的字典。

    # 遍历学生人数
    for i in range(s):
        # 初始化学生字典,包含评分列表、学号、最低分、最高分和平均分
        stu = {'score':[]}
    
  4. 在每个学生字典中,通过输入获取学生的学号,并遍历评委人数,获取每个评委的评分,并将其添加到评分列表中。

     # 输入学生学号
        stu.update({'sn':str(input('----\n请输入学生学号:'))})
        
        # 遍历评委人数
        for j in range(t):
            # 输入评委的评分
            stu['score'].append(input('请输入评委'+str(j+1)+'的评分:'))
    
  5. 对评分列表进行排序,然后获取最低分和最高分,并计算平均分。

      # 对评分列表进行排序
        stu['score'].sort()
        
        # 获取最低分
        stu.update({'min':stu['score'].pop(0)})
        
        # 获取最高分
        stu.update({'max':stu['score'].pop()})
        
        # 计算平均分并更新字典
        stu.update({'avg':sum(stu['score'])/len(stu['score'])})
    
  6. 将学生字典添加到学生列表中。

    # 将学生字典添加到学生列表中
        stus.append(stu)
    
  7. 最后,使用字典推导式生成学生学号和平均分的字典,并输出结果。

# 使用字典推导式生成学生学号和平均分的字典
r = {n['sn']:n['avg'] for n in stus}

参考代码

t = int(input('请输入评委人数(不得少于3人):'))
s = int(input('请输入学生人数(不得少于1人):'))
stus = []
for i in range(s):
    stu = {'score':[]}
    stu.update({'sn':str(input('----\n请输入学生学号:'))})
    for j in range(t):
        stu['score'].append(input('请输入评委'+str(j+1)+'的评分:'))
    stu['score'].sort()
    stu.update({'min':stu['score'].pop(0)})
    stu.update({'max':stu['score'].pop()})
    stu.update({'avg':eval('+'.join(stu['score']))/len(stu['score'])})
    stus.append(stu)
r = {n['sn']:n['avg'] for n in stus}
print(r)

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

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

相关文章

uvm环境获取系统时间的方法和使用案例

背景&#xff1a; 有时候我们想统计一下验证环境中某个步骤总共花费了多少时间&#xff0c;有什么比较方便的方法呢&#xff0c;利用$realtime理论上也是能做到的&#xff0c;不过这个和timescale绑定起来了&#xff0c;需要手动换算成单位是秒的数&#xff0c;现在提供一种利用…

最强英文开源模型Llama2架构与技术细节探秘

prerequisite: 最强英文开源模型LLaMA架构探秘&#xff0c;从原理到源码 Llama2 Meta AI于2023年7月19日宣布开源LLaMA模型的二代版本Llama2&#xff0c;并在原来基础上允许免费用于研究和商用。 作为LLaMA的延续和升级&#xff0c;Llama2的训练数据扩充了40%&#xff0c;达到…

C语言——写一个函数,每调用一次这个函数,就会将num的值增加1

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void Add(int* p) {(*p); // 的优先级高于* } int main() {int num0;Add(&num);printf("第一次调用:num %d\n",num);Add(&num);printf("第二次调用:num %d\n",num);Add(&num);p…

Python如何实现原型设计模式?什么是原型设计模式?Python 原型设计模式示例代码

什么是原型&#xff08;ProtoType&#xff09;设计模式&#xff1f; 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在通过复制现有对象来创建新对象&#xff0c;而无需通过标准的构造方式。它允许我们基于现有对象创建新对象&#xf…

数电实验-----实现74LS153芯片扩展为8选1时间选择器以及应用(Quartus II )

目录 一、74LS153芯片介绍 管脚图 功能表 二、4选1选择器扩展为8选1选择器 1.扩展原理 2.电路图连接&#xff08;Quartus II &#xff09; 3.仿真结果 三、8选1选择器的应用 1.三变量表决器 2.奇偶校验电路 一、74LS153芯片介绍 74ls153芯片是属于四选一选择器的芯片。…

你听说过“消费多少返利多少的”模式吗?

今天分享一个新的销售套路&#xff0c;看懂套路奋斗节约3年&#xff0c;你听说过“消费多少返利多少的”模式吗&#xff1f; 消费报销模式就是消费者在平台的消费&#xff0c;根据贡献度和活跃度平台去把之前消费的模式&#xff0c;给你返本了甚至还额外给你补贴奖励&#xff…

BP神经网络原理与如何实现BP神经网络

本文部分图文来自《老饼讲解-BP神经网络》bp.bbbdata.com 目录 一、BP神经网络的背景生物学原理 二、BP神经网络模型 2.1 BP神经网络的结构 2.2 BP神经网络的激活函数 三、BP神经网络的误差函数 四、BP神经网络的训练 4.1 BP神经网络的训练流程 4.2 BP神经网络的训练流…

1.索引的本质

索引是帮组MYSQL高效获取数据的排好序的数据结构 二叉树 二叉树是树节点的度不大于2的有序树。它是一种最简单最重要的树。 二叉树的左节点始终小于父节点。二叉树的有节点始终大于等于父节点 对于单边递增的数据&#xff0c;二叉树会变成链表的形式。这个时候查询不会减少次数…

使用cli批量下载GitHub仓库中所有的release

文章目录 1\. 引言2\. 工具官网3\. 官方教程4\. 测试用的网址5\. 安装5.1. 使用winget安装5.2. 查看gh是否安装成功了 6\. 使用6.1. 进行GitHub授权6.1.1. 授权6.1.2. 授权成功6.2 查看指定仓库中的所有版本的release6.2.1. 默认的30个版本6.2.2. 自定义的100个版本6.3 下载特定…

IDEA前端thymeleaf只显示部分数据库问题

只显示int类型的number&#xff0c;不显示string类型的price和weight 先看一下apple.html <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>User List</title> </…

【ROS】RViz2源码分析(三):核心类VisualizerApp

【ROS】郭老二博文之:ROS目录 1、简述 VisualizerApp包含了三个主要的功能: QApplication:程序中主要调用app_->processEvents()来处理刷新界面,处理闪屏VisualizationFrame:窗口类都在此;RosClientAbstractionIface包含rclcpp::Node:代表ROS节点2、VisualizationF…

使用 VPN ,一定要知道的几个真相!

你们好&#xff0c;我的网工朋友。 今天想和你聊聊VPN。在VPN出现之前&#xff0c;企业分支之间的数据传输只能依靠现有物理网络&#xff08;例如Internet&#xff09;。 但由于Internet中存在多种不安全因素&#xff0c;报文容易被网络中的黑客窃取或篡改&#xff0c;最终造…

FPGA实现双向电平转换

网上搜了一圈&#xff0c;好像没看到的类似的中文资料&#xff0c;不过MicroSemi有个文档AC349上给出了完整的解决方案&#xff0c;还有参考代码。 话不多说&#xff0c;看图&#xff1a; 欲知详情的朋友&#xff0c;请参考 AC349

一起Talk Android吧(第五百五十五回:Retrofit中的注解)

文章目录 1. 概念介绍2. 注解的分类与功能2.1 方法类注解2.2 参数类注解3. 内容总结各位看官们大家好,上一回中分享了一个Retrofit使用错误的案例,本章回中将 介绍Retrofit请求中的注解。闲话休提,言归正转,让我们一起Talk Android吧! 1. 概念介绍 我们在前面章回中介绍R…

YOLO改进系列之注意力机制(GAM Attention模型介绍)

模型结构 为了提高计算机视觉任务的性能&#xff0c;人们研究了各种注意力机制。然而以往的方法忽略了保留通道和空间方面的信息以增强跨维度交互的重要性。因此&#xff0c;liu提出了一种通过减少信息弥散和放大全局交互表示来提高深度神经网络性能的全局注意力机制。作者的目…

趣学python编程 (四、数据结构和算法介绍)

数据结构和算法在编程中非常重要。数据结构是组织和存储数据的方式&#xff0c;而算法是解决问题的方法和步骤。你要挑战的蓝桥杯&#xff0c;实际也是在设计算法解决问题。其实各种编程语言都只是工具&#xff0c;而程序的核心数据结构算法。犹如练武&#xff0c;数据结构和算…

算法学习 day26

第二十六天 最大子数组和 53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 动态规划问题 class Solution {public int maxSubArray(int[] nums) {int len nums.length;int[] dp new int[len];dp[0] nums[0];int res dp[0];for(int i 1; i < len; i){dp[i] …

【Java】异常处理(一)

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;什么都不做&#xff0c;才会来不及 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录 &#x1f4cb;前…

【运维篇】5.6 Redis server 主从复制配置

文章目录 0. 前言1. 配置方式步骤1: 准备硬件和网络步骤2: 安装Redis步骤3: 配置主服务器的Redis步骤4: 配置从服务器的Redis步骤5: 测试复制功能步骤6: 监控复制状态 2. 参考文档 0. 前言 在Redis运维篇的第5.6章节中&#xff0c;将讨论Redis服务器的主从复制配置。在开始之前…

Linux程序设计(上)

系列文章目录 文章目录 系列文章目录前言一、unix, linux, GNU, POSIXLinux程序 二、shellshell语法1.变量2.语句 函数命令命令的执行dialog工具-- 三、文件操作1. Linux 文件结构2. 系统调用和设备驱动程序3. 库函数4. 底层文件访问5. 标准I/O库6.格式化输入输出7. 文件和目录…