组合和为N的数量-第13届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第78讲。

组合和为N的数量,本题是2022年3月13日举办的第13届蓝桥杯青少组Python编程选拔赛真题编程部分第3题。题目要求将M个正整数中任意两个数进行组合,且求出每组组合的和, 请编程计算出M个正整数中有多少组组合的和恰好等于N。

先来看看题目的要求吧。

一.题目说明

编程实现:

给定一个正整数N和M个不同的正整数,然后将 M 个正整数中任意两个数进行组合,且求出每组组合的和, 问 M 个正整数中有多少组组合的和恰好等于N。

如:正整数N为6,M为5,5个不同的正整数分别为 1,2,3,4,5。

任意两数组合有10组:1 + 2,1 + 3,1 + 4,1 + 5,2 + 3,2 + 4,2 + 5,3 + 4,3 + 5,4 + 5, 其中和恰好等于6的组合有2组:1 + 5,2 + 4

输入描述:

第一行输入一个正整数N第二行输入M个不同的正整数,且正整数之间以一个英文逗号隔开

输出描述:

输出M个不同正整数中有多少组组合的和恰好等于N

样例输入:

5

1,2,3,4,5

样例输出:

2

02

二.思路分析

这是一道简单的算法题,涉及的知识点包括循环、列表、枚举算法等。

题目比较简单,其实就是两数之和问题,可以参考《两数之和-第12届蓝桥杯选拔赛Python真题精选》这篇教程。

之前也给出了三种典型的解决方案:

  • 暴力枚举

  • 组合函数

  • 单循环遍历

这3种解法比较简单,这里就不再介绍了。除此之外,还可以使用对撞指针算法来实现。

所谓对撞指针,是指使用两个指针left、right分别指向列表第一个元素和最后一个元素,然后left指针不断递增,right不断递减,直到两个指针的值相撞(即 left== right)为止,如图:

使用对撞指针,可以将时间复杂度降低到O(n),效率更高。

思路有了,接下来,我们就进入具体的编程实现环节。

三.编程实现

根据上面的思路分析,我们使用三种方法来编写程序:

  • 枚举算法

  • 组合函数

  • 对撞指针

1. 枚举算法

枚举算法的思路,就是使用两层循环,找到所有的组合,代码如下:

图片

2. 组合函数

使用combinations()函数可以直接获取两个数的组合,从而简化代码,如下:

图片

3. 对撞指针

使用对撞指针的代码如下:

图片

代码不多,说明两点:

1). 使用对撞指针,需要确保列表是有序的,所以需要先使用sort()进行排序;

2). 对于任意的两个指针left和right来说,分三种情况,如果两数和等于n时,将cnt加1,两个指针都前进一步,如果两数和小于n,left右移,否则right左移,直到两个指针撞到一起了,循环结束。

至此,整个程序就全部完成了,你可以输入不同的数据来测试效果啦。

四.总结与思考

本题代码在10行左右,涉及到的知识点包括:

  • 循环语句;

  • 列表操作;

  • 枚举算法;

  • 组合函数;

  • 双指针算法;

本题代码不多,难度一般,关键点是要掌握多种解决方案,尽量提高算法效率。

相信你已经发现了,两数之和问题出现的频率还挺高的。实际上,它是经典的算法入门题目,在著名的Leetcode网站中,第一题就是两数之和。

题目虽然简单,但是解决方案比较多,非常考验我们的基本功。

枚举是最基本的方法,但是效率不高;组合函数是Python给我们的福利,使用起来非常方便;对撞指针则是巧妙的算法,可以极大地提升算法效率,当然还有一些其他的解决方案,比如哈希算法。

既然提到了Leetcode,超平老师就顺便给你留一道思考题,就是Leetcode的第一题,两数之和。


给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2, 7, 11, 15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

 

你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄

需要源码的,可以移步至“超平的编程课”gzh。

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

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

相关文章

直播用什么领夹麦比较好?轻揭秘无线领夹麦克风哪个品牌音质最好

​在当下自媒体风起云涌的时代,领夹式无线麦克风以其卓越的音质和便携性,已然成为视频博主、直播达人和新闻访谈的得力助手。在短视频、直播互动、在线访谈等多个场景中,它们默默守护着每一声清晰的传递,为内容的呈现增色添彩。面…

AWS EMR Serverless

AWS概述 EMR Serverless 简介 在AWS概述一文中简单介绍过AWS EMR, 它是AWS提供的云端大数据平台。借助EMR可以设置集群以便在几分钟内使用大数据框架处理和分析数据。创建集群可参考官方文档:Amazon EMR 入门。但集群创建之后需要一直运行,用户需要管理…

SSL证书到底怎么选?

在全球CA官方原厂的SSL证书兼容性达到99%的机构仅有4家,其中一家勉强,分别:GlobalSign、DigiCert、Sectigo、Certum,如果不在这个范围的建议都不用看。 【不包括套用品牌的“国产化”SSL证书、山寨SSL证书,这些证书的…

聊一聊 js的事件循环、进程、线程、定时器延迟问题

概括来说是什么? 所谓Event Loop,就是事件循环,其实就是JS管理事件执行的一个流程,具体的管理办法由他具体的运行环境确定。目前JS的主要运行环境有两个,浏览器和Node.js。这两个环境的Event Loop还有点区别&#xff…

Leetcode 力扣107. 二叉树的层序遍历 II (抖音号:708231408)

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[15,7],[9,20],…

LabVIEW 反向工程的实现与法律地位

什么是LabVIEW反向工程? 反向工程是指从现有的应用程序或软件中推导出其设计、架构、代码等信息的过程。对于LabVIEW而言,反向工程涉及从现有的VI(虚拟仪器)文件、项目或应用程序中提取出设计思路、功能模块、算法实现等。 LabV…

Ubuntu server 24.04 (Linux) 搭建DNS服务器 通过Nginx实现UDP/TCP负载均衡 轻量级dnsmasq服务器

一 系统运行环境 testtest:~$ cat /etc/os-release PRETTY_NAME"Ubuntu 24.04 LTS" NAME"Ubuntu" VERSION_ID"24.04" VERSION"24.04 LTS (Noble Numbat)" VERSION_CODENAMEnoble IDubuntu ID_LIKEdebian HOME_URL"https://www.…

【AI大模型】Prompt Engineering

目录 什么是提示工程(Prompt Engineering) Prompt 调优 Prompt 的典型构成 「定义角色」为什么有效? 防止 Prompt 攻击 攻击方式 1:著名的「奶奶漏洞」 攻击方式 2:Prompt 注入 防范措施 1:Prompt 注…

linux查看磁盘类型命令

在Linux中,有多种方法可以查看磁盘是固态硬盘(SSD)还是机械硬盘(HDD)。以下是一些常用的方法: 查看/sys/block/目录 /sys/block/目录包含了系统中所有块设备的信息。你可以查看这个目录中的设备属性来判断…

计算机网络 —— 数据链路层(以太网)

计算机网络 —— 数据链路层(以太网) 什么是以太网以太网传输介质和拓扑结构的发展传输介质的发展:拓扑结构的发展: 10BASE-T 以太网适配器和MAC地址适配器(Adapter)MAC地址适配器与MAC地址的关系 MAC帧以太…

保姆级教程:Redis 主从复制原理及集群搭建

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。 😊 座右铭:不…

Unity编辑器扩展-番外篇-Gizmos基础-物体如何在球面上移动

目录 一、本节目标效果展示 二、先画出素材 1.先新建一个普通的代码 2.画素材(一个头,两个耳朵,一个鼻子) a.关于贴心的Unity b.开始画素材 三、了解移动的原理 四、辅助物体的建立 五、画左耳朵 六、全部代码 七、作者的…

开源模型应用落地-LangChain试炼-LCEL-表达式语言(一)

一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么&…

AC自动机(查询)

上面讲了AC自动机是如何建树和建自动机的,这里要讲的是AC自动机的查询和各个数组的功能和作用。 其实AC自动机的查询和KMP算法是及其相近的,都是一个指针跑主串,另一个指针跑ne串(这里就是回跳边)。 话都说到这了&…

Linux C语言学习:数据类型

一、 为什么要引入数据类型 • 计算机中每个字节都有一个地址(类似门牌号) • CPU通过 地址 来访问这个字节的空间 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …

南京观海微电子-----555函数信号发生器电路分析

电路图 整个电路的工作过程: 首先,555芯片通过外围电阻电容组成一个多谐振荡器,输出一个方波。 555多谐振荡器输出方波后,经电容C1耦合到由R3,C3组成的积分网络。输出三角波。这也是一个电容充放电的过程&#xff0c…

【Linux系统】进程信号

本篇博客整理了进程信号从产生到处理的过程细节,通过不同过程中的系统调用和其背后的原理,旨在让读者更深入地理解操作系统的设计与软硬件管理手段。 目录 一、信号是什么 1.以生活为鉴 2.默认动作与自定义动作 3.信号的分类、保存、产生 二、产生…

彻底吃透A*算法的最优性

下面的博客将主要介绍A*算法在扩展结点(这对于寻路时间很重要)和总代价(这对于保证最后解的最优性很重要)上的最优性,并将淡化对A *完备性的介绍。 A* 算法流程 A*算法的流程如下[1]: 并定义 f ( n ) f(n…

【云原生_K8S系列】Kubernetes 控制器简介

概述 Kubernetes是一个开源的容器编排平台,旨在自动化部署、扩展和管理容器化应用。Kubernetes 的核心组件之一是控制器(Controller),它负责确保集群中的实际状态与用户定义的期望状态一致。控制器是 Kubernetes 控制平面的一个重…