BC14鸡兔同笼升级版
题目 ,参考资料:《python核心编程》第七章
薯片4块钱,鸡蛋2块。
买了的商品数量是5,总价是14块,存货是3(即购买每种商品不能大于3个)
问,买了哪些商品?各几样?
当然这是例题,真正的题目在这
::: {.image-package}
\
::: {.image-caption}
:::
:::
分析:这里应该要用到字典。所谓字典,是指它有一个特殊的结构。
普通的数据就是,xx =10。字典,把两个原本不相干的数据联系到一起,把它叫做
key-value 结构。
比如下图,可以构造一个字典: xx = { '薯片' :’薯片价格’,’薯片数量’
,’鸡蛋’:’鸡蛋价格’,’鸡蛋数量’}
这样,薯片和薯片数量等就联系到了一起。
薯片叫做key(键),薯片数量以及薯片价格叫做value(值)。(key是唯一的,value可以有很多)
::: {.image-package}
\
::: {.image-caption}
数量写错了,应该是小于等于三
:::
:::
当输入key的时候,python就会输出字典的value
::: {.image-package}
\
::: {.image-caption}
:::
:::
建立框架(参考BC11
request模块)。成功获得所需要计算的数字。
::: {.image-package}
\
::: {.image-caption}
:::
:::
同理,获取字符串的正则表达式为,[a-zA-z]+
成功组合为一个字典
::: {.image-package}
\
::: {.image-caption}
:::
:::
接下来要求值,太多商品了,没什么思路,,依据例题先写个框架吧。
::: {.image-package}
\
::: {.image-caption}
:::
:::
2018年1月9日更新:这道题当初因为做不出来,所以放了许久没碰它,当初以为不能用嵌套循环。问了别人才发现,当初犯的错误可能是str没有转换为int。
用for i in
range()嵌套循环,结果成功算出答案,有很多种答案。这里只取第一个符合条件的就可以了吧。
::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\
::: {.image-caption}
:::
:::
源码:通过和上图类似的写法,虽然成功获取了要计算的商品和价格,但是并没有算出答案。。。。。明明类型没有错误
::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\
::: {.image-caption}
:::
:::
看来还有地方没想到。。。。。。。又解决了一个bug。因为item是数量,所以理所当然的以为是值Values相加等于购买的数量,然而想一想,Values全部相加的结果是商品单价之和,怎么可能是商品数量。
没想到应该是Key,例如Egg,MusicCD等,这些商品名称被我赋值了,所以整型可以相加。
::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\
::: {.image-caption}
:::
:::
然后将答案组合,用webbrowser模块的方法,自动用浏览器打开组合好的url链接。
::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\
::: {.image-caption}
:::
:::
说没有正确发送cookie,看了很多文章,觉得requests模块虽然方便,但是不够灵活。。也许是我不会用吧。
::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\
::: {.image-caption}
:::
:::
::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\
::: {.image-caption}
:::
:::
虽然正确的发送了cookie,但显示太慢了。而且好像算错了。
::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\
::: {.image-caption}
:::
:::
源码。改正了以后,还是很慢,不知道如何提升效率。。。
::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\
::: {.image-caption}
:::
:::
(2018年1月12日更新)对于迭代,python有高级写法,列表推导:下图57到62行,只用一行就可以表示。使用列表推导,不仅简短,效率更加高,因为右边这样的代码,必须使用计数器来跟踪待处理元素,每次循环都需要查看哪些元素已经修改了。
::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\
::: {.image-caption}
:::
:::
也许效率还可以提升,因为该代码根据题目不同,有时候能够在3秒内计算完成,有时候不能。
::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\
::: {.image-caption}
:::
:::
2018.1.19.根据《大话数据结构》中的第二章节,该脚本的时间复杂度”大O阶”,为O[n的8次方],应该算是很糟糕的算法。。尴尬
补算法去了。
:::
:::
:::