Python解题 - CSDN周赛第33期
本期四道题全考过,题解在网上也都搜得到。。。没有想法,顺手水一份题解吧。
第一题:奇偶排序
给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。
输入描述:第一行输入整数n。(1<=n<=1000)表示数组大小;第二行输入n个整数a.(1<=n<=100)
输出描述:输出重排之后的数组。
示例:
示例 输入 6
3 34 67 89 90 58输出 3 67 89 34 90 58
分析
超级大水题,直接遍历一遍数组,把奇数和偶数分开成两个数组,最后再把两个数组返回即可,时间复杂度 。
如果想加点花,比如降低空间复杂度(上面需要借助外部空间存储奇数和偶数数组),可以在原数组遍历,如果遇到奇数,就和它前面的数交换位置,直到前面为空或不是偶数位置。类似冒泡排序,时间复杂度 ,很没必要。
本题因为要求奇数间和偶数间的相对位置不变,所以不能使用不稳定的排序方法比如快排。
参考代码
n = int(input().strip())
arr = [int(item) for item in input().strip().split()]
odd = list()
even = list()
for i in arr:if i%2: odd.append(i)else: even.append(i)
print(*odd, *even)
第二题:小艺改编字符串
已知字符串str。添加至少多少字符可以使得str变成回文串。
输入描述:输入字符串s.(1<=len(str)<=100000)
输出描述:输出最小需要添加字符的数量。
示例:
示例 输入 abab 输出 1
分析
很久以前考过,不过还是值得一说。思路还是动态规划,好像递归也可以?没有试过。
问哥觉得关于字符串的动态规划常常有点抽象,不太好理解,所以保险起见,我们还是画图来看。
首先,对于任意一个长度大于 1 的字符串(长度等于 1 的字符串本身就是回文串,不需要添加字符),如果我们观察它的左右两端,只有下面两种可能:
- 最左端和最右端的字符相同;
- 最左端和最右端的字符不同。
我们可以用 和
表示左右两端字符串的下标,用
表示从下标
到
的字符串,如下图所示:
然后,对于左右端字符相同的字符串,我们可以把它们剥掉,得到一个新的子串 ,很显然,只要子串
是回文串,那么原来的
必定也是回文串。所以原问题就转变成一个子问题:需要添加多少字符可以使得子串
变成回文串?
而对于左右端字符不同的字符串,我们有两种选择:
- 如果子串
是回文串,我们可以在左边添加一个和最右端相同的字符,使原字符串
变成回文串;
- 如果子串
是回文串,则我们也可以在右边添加一个和最左端相同的字符,使原字符串
变成回文串。
那么,只要在这两种选择中取较小的作为答案即可。
于是,动态转移过程就很清楚了。我们定义一个二维数组 表示需要添加多少字符使得字符串
变成回文串,则可得状态转移方程如下(
和
分别表示字符串
左右两端的字符):
- 如果
,则
- 如果
,则
先给个递归的写法,就是直接把上面的转移公式套进来。
参考代码一
def fun(s):n = len(s)if n <= 1: return 0i, j = 0, n-1if s[i] == s[j]: return fun(s[i+1:j])return min(fun(s[i:j]), fun(s[i+1:j+1]))+1
s = input().strip()
print(fun(s))
但是因为字符串长度达到1e5,递归极有可能超时。
但是递归给我们的顺序值得参考:所有递归到最终的字符串长度必定为 1 或 0 (空字符串)。
所以,如果我们使用动态规划,原字符串的答案,必须按子字符串的长度,从小到大,递推过来。也就是说,我们必须先得到所有长度为 1 或 0 的子串的答案,再递推到长度为 2 的,然后是长度为 3 的。。。直到长度等于原字符串。
所以我们在传统的 双循环中必须加一个变量
,用来表示子字符串的长度。而一旦
的长度确定了,
,所以还是双循环。循环次数也很好计算,就是所有子串数量之和:
时间复杂度是 ,但是因为除以 2,所以计算量级还是 1e9,勉强可以接受。
参考代码二
s = input().strip()
n = len(s)
dp = [[0]*n for _ in range(n)]
for k in range(1, n):for i in range(n - k):j = i + kif s[i] == s[j]: dp[i][j] = dp[i+1][j-1]else: dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1
print(dp[0][n-1])
第三题:公司新表
公司里为了凸显公司的特性。安装了一个n进制表。已知新的表的时间是”H:M”。时间合法的定义为H<=23 && M<=59。时间有多少种进制定义的方式,依次打印出来。如果有无数种解输出”-1”,不存在输出”0”。
输入描述:输入一行字符串a:b形式。
输出描述:输出答案。
示例:
示例 输入 11:20 输出 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
分析
13期考过。
不难,但是因为要分析字符串,既抽象又繁琐,所以本题参考代码不想给了,问哥写得很繁琐,大部分时间浪费在这题,看到就烦 ><。
简单说说思路:先把给定的字符串按冒号一分为二,左边为小时数,右边为分钟数。
先特判,什么样的情况是有无数种解呢?因为字符串中可以含有字母,那么假定字母代表了一个数字,只要不进位(字符串长度为 1),就可以代表无数种解。比如一个字母 A,可以代表11进制以上的所有进制,因为 A 就代表了10(按照顺序),是合法的小时(小于24)或分钟(小于60)数。同样,很显然,如果代表小时的一个字母表示了24以上的十进制数字,或代表分钟的一个字母表示60以上的十进制数字,则必定是没有解,返回 0。
而如果进了一位,答案必定有限,比如 11,最多只能代表22进制(该进制中11代表十进制的23)。所以,只要检查分割后的代表小时和分钟的字符串的长度,小于等于1且代表十进制数字小于24或小于60,就必定是无数种解,直接返回-1。
然后就是穷举了,从小时和分钟数所能代表的最小进制开始,比如字符串AB,不可能代表12进制及以下的进制。然后循环加一,每次计算小时和分钟翻译成十进制是否小于24和小于60。知道不满足此条件为止。
如果一个都没找到,很显然,直接返回 0。否则就把所有答案打印出来即可。
第四题:选择客栈
丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号。每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过 p 。他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元的咖啡店小聚。
输入描述:共n+1 行。第一行三个整数 n ,k ,p ,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值;接下来的 n 行,第 i+1 行两个整数,之间用一个空格隔开,分别表示 i 号客栈的装饰色调和 i 号客栈的咖啡店的最低消费。
输出描述:一个整数,表示可选的住宿方案的总数。
示例:
示例 输入 5 2 3
0 5
1 3
0 2
1 4
1 5输出 3
分析
15期考过。还是动态规划,可以参考我以前的题解,详细记录了思考过程(写得可能有些繁琐),这里不再赘述了。
相关文章:
Python解题 - CSDN周赛第33期
本期四道题全考过,题解在网上也都搜得到。。。没有想法,顺手水一份题解吧。 第一题:奇偶排序 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 输入描述:第一行输入整数n。(1<n<…...
Session攻击
Session攻击Session攻击简介主要攻击方式会话预测会话劫持中间人攻击会话固定Session攻击简介 Session对于Web应用是最重要的,也是最复杂的。对于Web应用程序来说,加强安全性的首要原则就是:不要信任来自客户端的数据,一定要进行数据验证以及…...

【Linux】Shell详解
😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页…...
汉字找不同隐私协议
本隐私信息保护政策版本:2021 V1 一、重要提示 请您(以下亦称“用户”)在使用本平台App时仔细阅读本协议之全部条款,并确认您已完全理解本协议之规定,尤其是涉及您的重大权益及义务的加粗或划线条款。如您对协议有任…...

CEC2017:斑马优化算法(Zebra Optimization Algorithm,ZOA)求解cec2017(提供MATLAB代码)
一、斑马优化算法 斑马优化算法(Zebra Optimization Algorithm,ZOA)Eva Trojovsk等人于2022年提出,其模拟斑马的觅食和对捕食者攻击的防御行为。 斑马因身上有起保护作用的斑纹而得名。没有任何动物比斑马的皮毛更与众不同。斑…...

【Linux要笑着学】进程创建 | 进程终止 | slab分派器
爆笑教程《看表情包学Linux》👈 猛戳订阅!💭 写在前面:本章我们主要讲解进程的创建与终止。首先讲解进程创建,fork 函数是我们早在讲解 "进程的概念" 章节就提到过的一个函数&#…...

数据资产管理建设思考(二)
关于数据资产管理,近两年是数据治理行业中一个热点话题,当然有我们前面提到的国家的政策支持及方向指引的原因。另一方面我们做数据治理的同行们从学习吸收国外优秀的数据治理理论,进一步在实践中思考如何应用理论,并结合我们国家…...

微软发布多模态版ChatGPT!取名“宇宙一代”
文|CoCo酱Ludwig Wittgenstein曾说过:“我语言的局限,即是我世界的局限”。大型语言模型(LLM)已成功地作为各种自然语言任务的通用接口,只要我们能够将输入和输出转换为文本,就可以将基于LLM的接…...

【学习笔记】深入理解JVM之对象的实例化
参考尚硅谷JVM 102 - 106 集 首发地址:地址 1、JVM对象的实例化 1.1 对象的创建方式 对象有一下几种创建对象的方式 new Object object new Object();Class的newInstance() Object object Object.class.newInstance();Constructor的newInstance(…...

IP协议的漏洞及防护措施
文章目录一、TCP/IP协议族二、IP协议三、IP协议的安全问题及防护措施一、TCP/IP协议族 二、IP协议 网际协议(Internet Protocol,IP)是TCP/IP协议族的核心,也是网际层最重要的协议。 IP数据报由首部和数据两部分组成;…...
Linux命令·mkdir
linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录。1.命令格式:mkdir [选项] 目录...2.命令功能:通过 mkdir 命令可以实现…...

智能家居项目(八)之树莓派+摄像头进行人脸识别
目录 1、编辑Camera.c 2、编辑contrlDevices.h 3、编辑mainPro.c 4、进行编译: 5、运行结果: ./test1 6、项目图片演示 智能家居项目(七)之Libcurl库与HTTPS协议实现人脸识别_Love小羽的博客-CSDN博客 经过上一篇文章&…...

渗透测试之地基服务篇:无线攻防之钓鱼无线攻击(上)
简介 渗透测试-地基篇 该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。 请注意 : 本文仅用于技术讨论与研究,对于所有笔记中复现…...

「ABAP」一文带你入门OPEN SQL中的SELECT查询(附超详细案例解析)
💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…...

【搞透C语言指针】那年我双手插兜, 不知道指针是我的对手
☃️内容专栏:【C语言】进阶部分 ☃️本文概括: 征服C语言指针!一篇文章搞清楚指针的全部要点。 ☃️本文作者:花香碟自来_ ☃️发布时间:2023.3.3 目录 一、字符指针 二、指针数组 三、数组指针 1.数组指针的定义…...

如何从 Android 手机上的 SD 卡恢复已删除的照片
为了扩展手机的存储空间,很多人都会在安卓手机上插入一张SD卡来存储一些大文件,比如电影、照片、视频等。虽然SD卡给我们带来了很大的方便,但我们还是避免不了数据丢失一些事故造成的。您是否正在为 SD 卡上的照片意外丢失而苦恼?…...

01-前端-htmlcss
文章目录HTML&CSS1,HTML1.1 介绍1.2 快速入门1.3 基础标签1.3.1 标题标签1.3.2 hr标签1.3.3 字体标签1.3.4 换行标签1.3.5 段落标签1.3.6 加粗、斜体、下划线标签1.3.7 居中标签1.3.8 案例1.4 图片、音频、视频标签1.5 超链接标签1.6 列表标签1.7 表格标签1.8 布…...

【YOLO系列】YOLOv5超详细解读(网络详解)
前言 吼吼!终于来到了YOLOv5啦! 首先,一个热知识:YOLOv5没有发表正式论文哦~ 为什么呢?可能YOLOv5项目的作者Glenn Jocher还在吃帽子吧,hh 目录 前言 一、YOLOv5的网络结构 二、输入端 (1…...

从 ChatGPT 爆火回溯 NLP 技术
ChatGPT 火遍了全网,多个话题频频登上热搜。见证了自然语言处理(NLP)技术的重大突破,体验到通用技术的无限魅力。GPT 模型是一种 NLP 模型,使用多层变换器(Transformer)来预测下一个单词的概率分…...

面了 6 家大厂,并拿下 5 家 offer,进大厂好像也没有那么困难吧....
前言 二月份的时候因为换工作的缘故,陆续参加了华为、蚂蚁、字节跳动、PDD、百度、Paypal 的社招面试,除了字节跳动流程较长,我主动结束面试以外,其他的都顺利拿到了 Offer。 最近时间稍微宽裕点了,写个面经…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...