Python每日一练:小艺的口红(暴力、二分、图论三种方法)代写匿名信

news2024/10/7 14:32:00

文章目录

  • 前言
  • 0、题目
  • 一、暴力查找
  • 二、二分查找
  • 三、有序二叉树
  • 总结(代写匿名信)


前言

很明显小艺的口红问题是考的是查找算法,对于这种一次性查找,直接暴力就行了,当然咱是为了学习,所以用来练练各种查找,基础是二分查找法!其它方法大多基于二分查找改进的。更高级的二叉排序树查找,B树、B+树啥的,也统统都得排序。这里用暴力法、二分法、二叉排序树这三种有代表性的方法来解。嗯~ 这个题目测试数据应该有问题,反正我0分~ 好像所有我做不出100分的,我都说是题目问题哈


提示:以下是本篇文章正文内容,下面案例可供参考

0、题目

题目描述:
小艺的口红越来越多了。 小艺想从自己的口红堆里挑选一个色度大于等于x的最小口红的色度。 小艺每天都会为了这个问题发愁。 作为小艺的忠实狗腿子,小Q决定帮小艺编一个程序,录入所有的口红色度。 然后智能的选择最小色度。

输入描述:
第一行输入整数n,q。(1<=n,q<=1e5)表示口红的数量和询问次数。 第二行输入n个整数表示小艺口红的颜色t。(1<=t<=1e9) 以下 q-1 行每行输入一个整数h。(1<=h<=1e9)表示询问色度。

输出描述:
每个询问对应一个输出占一行。

示例的数据是这样的vector = [[1, 5, 9, 10, 2], [6], [7]]

一、暴力查找

从示例看,暴力法是好使的。

class Solution:
    def __init__(self) -> None:
        pass

    def solution(self, n, q, vector):
        result = []
        # TODO: 请在此编写代码
        for i in range(1, q):
            max = int(1e9)
            for v in vector[0]:
                if vector[i][0] <= v <= max:
                    max = v
            result.append(str(max))

        return result

这写法看上去还是比较科学的,不断减小max的值。一直到max值不能再小了就是它了。只需遍历一次、逻辑简单、运行速度快!

二、二分查找

class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, n, q, vector):
        result = []
        # TODO: 请在此编写代码
        vector[0].sort()
        for i in range(1,q):
            l, r = 0, n
            for v in vector[0][l:r]:
                mid = (l+r)//2
                if vector[i][0] > vector[0][mid] and vector[i][0] <= vector[0][mid+1]:
                    result.append(str(vector[0][mid+1]))
                    break
                elif vector[i][0] > vector[0][mid]:
                    l, r = mid+1, n
                else:
                    l, r = l, mid-1

        return result

在这里插入图片描述
从示例来看它也是好使的,如果要查找的值多了,这个方法会比暴力法快很多,二分查找的逻辑也简单,先对vector[0].sort()排序,然后不断的把列表分成左右两份。类似于猜数字游戏:我手上有纸条写了一个整数,并告诉你它在1-100之间,请你来玩猜数字游戏,我只会告诉你猜的数是大了还是小了,聪明的你肯定先猜50,如果大了就再猜25…以此类推,二分查找法就是根据这个游戏来的。结合代码一看就明白了吧~

三、有序二叉树

# 定义一个二叉树节点类结构体
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None


class Solution:    # 定义一个有序二叉树类
    def __init__(self, v):
        self.root = None
        vec = v[0]
        for x in vec:
            self.insert(x)

    def insert(self, val):    # 插入节点
        if not self.root:
            self.root = TreeNode(val)
            return

        curr = self.root
        while curr:
            if val < curr.val:
                if not curr.left:
                    curr.left = TreeNode(val)
                    return
                else:
                    curr = curr.left
            else:
                if not curr.right:
                    curr.right = TreeNode(val)
                    return
                else:
                    curr = curr.right

    def solution(self, target, curr=None, res=1e9):    # 按题意搜索
        if not curr:
            curr = self.root
        while True:
            if target <= curr.val <= res:
                res = curr.val
            if curr.left and target < curr.val:
                curr = curr.left
                self.solution(target, curr)
            elif curr.right and curr.val < target:
                curr = curr.right
                self.solution(target, curr)
            else:
                break
        return res

if __name__ == "__main__":

    from random import randint
    arr_temp = []   # [int(item) for item in input().strip().split()]

    n = randint(5, 20)  # int(arr_temp[0])
    for i in range(n):
        arr_temp.append(randint(1, 99))
    q = randint(2, 5)   # (arr_temp[1])

    vector = list()
    vector.append(arr_temp)
    for i in range(q-1):
        vector.append([randint(1, 99)])
    print(vector)
    sol = Solution(vector)

    for x in vector[1:]:
        result = sol.solution(x[0])
        print('result =', result, end=", ")

这个解法就属于高级货了,图论算法都算是高级算法了。当然二叉树还是相对比较简单的。这个算法的中心思想是:先定义一个根节点,比根节点小的放到左边去,比根节点大的放右边去,再来一个比根节点大的,我就去右边再根据大小找个地方放。就像树一样,不停的长出分枝,所以叫有序二叉树。代码中的insert函数就是用来生成树的。

代码中的TreeNode这个单独的类,是用来存放数据结构的。python没有struck,就用类来做数据结构了,C/C++中一般会用struck来这么定义,从一个单独的节点来看,这个类定义了根的值val,并记录了它的左右两边的节点。

代码中的solution函数是用来按题意搜索的,这题的搜索比较麻烦,是要找到一个从左边最接近的值,这里定义了一个curr用来表示当前节点,默认是None,下面只要按照大小从左或右边不停递归就行了。

笔者都用上这高级算法了可还是0分!很显然是题目错了,所以笔者自己写了一个随机数测试的办法(就是if __name__ == "__main__":)下面的部分,是从原代码那改来的:

[[95, 14, 1, 73, 60, 28, 35, 85, 22, 15], [20], [1], [36]] result = 22, result = 1, result = 60,

这里只给出一次测试结果来证明一下这个程序是可靠的,事实上我测了很多次,毕竟写一次有序二叉树也不容易,这种东西在实际工作中,几乎没有可能用到,因为大多数语言都有现成的方法函数来解决此类查找问题,谁吃饱了撑得慌去写这个,再说就算自己写了吧,还多半不如编程语言自带的函数来得效率高…有兴趣的看官可以自己试试。


总结(代写匿名信)

今天的另两题,近视的小张题目描述太长,对笔者的阅读理解能力是个特大考验,还是先去小学回炉语文再来吧~
另一个“代写匿名信”倒是简单,顺手也给出解法:

    def solution(self, words, msg):
        result = None
        # TODO: 请在此编写代码
        for m in msg:
            if m != " ":
                i = words.find(m)
                if i == -1:
                    result = "No"
                    break
                else:
                    words = words[:i] + words[i+1:]
                    result = "Yes"
        return result

就几行代码搞定,以上代码的逻辑是:去words中查找每个msg中的字符,嗯~除了空格以外,因为空格是不用字符的。不注意这点只能过90%,别问我怎么知道的… 在words中找到后就把它删了,循环完自然就知道能不能写成信了。

还想到个办法:用try和except,因为字符串的index方法找不到就会报错,报错自然会被except捕捉到,就可以NO了,try成功就删除index方法找到的值,也是循环一次就搞定。逻辑差不多的,有兴趣的可以写着试试。

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

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

相关文章

【Linux】基础IO_文件系统

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅 相关文章推荐&#xff1a; 【Linux】冯.诺依曼体系结构与操作系统 【C/进阶】如何对文件进行读写&#xff08;含二进制&#xff09;操作&#xff1f; 【Linux】基础…

【9种】ElasticSearch分词器详解,一文get!!!| 博学谷狂野架构师

ElasticSearch 分词器 作者: 博学谷狂野架构师GitHub&#xff1a;GitHub地址 &#xff08;有我精心准备的130本电子书PDF&#xff09; 只分享干货、不吹水&#xff0c;让我们一起加油&#xff01;&#x1f604; 概述 分词器的主要作用将用户输入的一段文本&#xff0c;按照一定…

二十一、线索转换1:点击转换按钮加载信息、搜索市场活动

功能需求 *在线索转换页面,展示:fullName,appellation,company,owner 流程图 代码实现 1.ClueMapper /*** 通过id查询线索详情* param id 线索id* return 对应id的线索*/Clue selectClueForDetailById(String id); ClueMapper.xml <select id"selectClueForDetailByI…

考研数学武忠祥 高等数学0基础课笔记

函数和映射 常见的函数 取整函数的基本性质 函数的有界性 例题 sinx 是从-1到1的&#xff0c;但是x是无界的 遇到这种带sin的&#xff0c;就要试着取特殊值&#xff0c;让它为1或者为0 函数的单调性 函数的奇偶性 函数的周期性 举例 数学中Q表示有理数集&#xff0c;下面…

Docker服务编排(Docker Compose) :部署上线nginx+springboot项目

Docker服务编排(Docker Compose) 微服务应用一般包含若干个微服务每个微服务一般会部署多个实例&#xff0c;如果每个微服务需要手动启停 维护工作量大 从Dockerfile build image 或者去dockerhub拉去image 创建多个容器 管理容器 Docker Compose 一个编排多容器分布式…

设计原则之【接口隔离原则】

文章目录 一、什么是接口隔离原则二、实例三、总结接口隔离原则与单一职责原则的区别 一、什么是接口隔离原则 接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09;是指用多个专门的接口&#xff0c;而不使用单一的总接口&#xff0c;客户端不应该依赖…

自学Java多久可以就业?Java这样自学实习都能过万!

昨天有00后学妹私信小源&#xff0c;她在学校已经学过java、C等相关课程&#xff0c;未来想走计算机的方向&#xff0c;问我建议还要学习什么语言&#xff0c;是否需要继续学Java?今天好程序员简单介绍下Java必学的技术&#xff01;想自学Java的真的可以试一试&#xff01; 一…

哈希数据结构的概念、实现和应用

一、认识哈希表 1.unordered_set和unordered_map STL实现了两个数据结构unordered_map和unordered_set顾名思义&#xff0c;因为底层的实现方式不同&#xff0c;它们成为了无序的map和set&#xff0c;但是它们的使用与普通的map和set是一样的。 我们可以通过代码测试两种数据…

【力扣--622】设计循环队列

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : 数据结构 &#x1f606;今日分享 : 丢脸其实并没有那么可怕&#xff0c;我们可以从另一个角度来想&#xff1a;别人能够记住我了&#xff0c;而且过了还有多少人能记得我呢&#xff1f;虽然这种出场不太优雅&#x1f606; 设…

python制作散点动图

目录 示例1&#xff1a;简单的散点图示例2&#xff1a;添加颜色和大小示例3&#xff1a;实时更新动图完整代码 本教程将介绍如何使用Python制作散点动图。我们将通过三个示例代码&#xff0c;从易到难&#xff0c;逐步说明如何使用Python绘制出散点动图。 示例1&#xff1a;简单…

图书馆客流人数统计分析系统方案

智慧客流人数统计分析系统可以帮助图书馆管理者更好地管理人群流量。系统能够自动统计区域内的人流量高峰期&#xff0c;并通过数据分析提供更加合理的管控&#xff0c;从而提区域内人群流动性&#xff0c;避免拥堵的情况。 AI客流视觉监控 客流量管控分析系统意义 讯鹏客流量管…

雪花算法生成ID

1.简介 SnowFlake 中文意思为雪花&#xff0c;故称为雪花算法。最早是 Twitter 公司在其内部用于分布式环境下生成唯一 ID。在2014年开源 scala 语言版本。 雪花算法的原理就是生成一个的 64 位比特位的 long 类型的唯一 id。 最高 1 位固定值 0&#xff0c;因为生成的 id 是…

Python的HTTP库及示例

13.3 HTTP库 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;是一个客户端和服务器端请求和应答的标准。客户端是终端用户&#xff0c;服务器端是网站。客户端发起一个到服务器上指定端口的HTTP请求&#xff0c;服务器向客户端发回一个状态行和响应的消息。 可以…

ICV: 2025年全球QKD产业规模有望达到25亿美元

近日&#xff0c;专注于量子、智能驾驶等前沿科技领域的国际咨询机构ICV发布了《全球量子安全通信产业研究报告》&#xff0c;报告主要内容包括量子安全通信的概念、量子密钥分发 (QKD)发展历程、QKD的优势、产业链、应用领域、QKD产业规模及预测、全球主要参与者。 量子安全通…

ubuntu18.04中PCL点云库依赖的安装以及PCL点云库和Eigen的卸载与安装

一、PCL点云库依赖的安装、遇到问题的解决方法 sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl sudo apt-get update sudo apt-get install libpcl-all 以上是官方给出的&#xff0c;但是会出很多报错&#xff0c;这里建议自己配置。 配置步骤&#xff…

【Android学习专题】安卓样式学习(学习内容记录)

学习记录内容来自《Android编程权威指南&#xff08;第三版&#xff09;》 样式调整和添加 调整颜色资源&#xff08;res/values/colors.xml&#xff09; 格式&#xff1a; 添加样式&#xff08;res/values/styles.xml&#xff09;&#xff0c;&#xff08;创建BeatBox项目时…

开源狂潮让巨头惨败!谷歌内部文件曝光:我们和OpenAI都没有护城河

因为开源&#xff0c;AI军备竞赛&#xff0c;谷歌和OpenAI全是输家&#xff1f; 来源丨新智元 重磅&#xff01; 谷歌的一份名为《我们没有护城河&#xff0c;OpenAI也没有》的内部文件疑似被泄露&#xff0c; 今天早上&#xff0c;外媒SemiAnalysis公布了这份重磅炸弹泄露…

日撸 Java 三百行day45

文章目录 说明day45 冒泡排序1. 基本思路2.代码 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;https://github.com/fulisha-ok/sampledata day45 冒泡排序 …

IP地址技术原理

IP地址用于唯一地标识一个网络设备&#xff08;如计算机、路由器等&#xff09;在互联网或局域网中的位置。IP地址由32位二进制数表示&#xff0c;通常分为4个8位二进制数&#xff0c;每个数用点号隔开&#xff0c;如106.110.92.215。IP地址可用于数据传输、网络管理和安全控制…

Springboot +Flowable,服务任务ServiceTask执行的三种方式(一)

一.简介 ServiceTask 从名字上看就是服务任务&#xff0c;它的图标是像下面这样&#xff0c;截图如下&#xff1a; ServiceTask 一般由系统自动完成&#xff0c;当流程走到这一步的时候&#xff0c;不会自动停下来&#xff0c;而是会去执行我们提前在 ServiceTask 中配置好的…