三色球问题python_面试题-三色球问题
本文作者 TomorrowWu,原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章。觉得好的话,顺手分享到朋友圈吧,感谢支持。
最近看了一道关于三色球的面试题,虽然很简单,但是还是考研编码能力的,下面做个对比
题目
有红、黄、绿三种颜色的球,其中红球3个,黄球3个,绿球6个。现将这12个球混放在一个盒子里,从中任意摸出8个球,编程计算摸出球的各种颜色搭配。
看到题目,显然是排列组合问题,下面看代码
优化前
func computeMatch1(redCount, yellowCount, greenCount, total int) int {
if redCount < 0 || yellowCount < 0 || greenCount < 0 || total <= 0 || total > redCount+yellowCount+greenCount {
return 0
}
num := 0
for r := 0; r <= redCount; r++ {
for y := 0; y <= yellowCount; y++ {
for g := 0; g <= greenCount; g++ {
if r+y+g == total {
//log.Printf("red:%v yellow:%v green:%v", r, y, g)
num++
}
}
}
}
return num
}
测试结果
为精确测出算法计算的时间,注释掉了log.Printf()代码
func Test_computeMatch1(t *testing.T) {
t1 := time.Now()
n := computeMatch1(3000,3000,6001,12000)
duration := time.Since(t1)
t.Logf("排列组合数量:%v 时长:%v",n,duration)
}
//结果
排列组合数量:3 时长:32.450475506s
代码未优化,三层for循环,且不管要求摸出多少球,遍历次数都一样,时间复杂度是O(n)=a*b*c,在球数比较大时,运算时间惊人
优化后
func computeMatch(redCount, yellowCount, greenCount, total int) int {
if redCount < 0 || yellowCount < 0 || greenCount < 0 || total <= 0 || total > redCount+yellowCount+greenCount {
return 0
}
num := 0
for r := 0; r <= redCount; r++ {
if yellowCount+greenCount < total-r {
continue
}
if r == total {
num++
//log.Printf("red:%v yellow:%v green:%v", r, 0, 0)
break
} else if r < total {
for y := 0; y <= yellowCount; y++ {
if r+y == total {
num++
//log.Printf("red:%v yellow:%v green:%v", r, y, 0)
break
} else if r+y < total {
needGreen := total - r - y
if needGreen > 0 && greenCount >= needGreen {
//log.Printf("red:%v yellow:%v green:%v", r, y, total-r-y)
num++
}
}
}
}
}
return num
}
测试结果
func Test_computeMatch(t *testing.T) {
t1 := time.Now()
n := computeMatch(3000,3000,6001,12000)
duration := time.Since(t1)
t.Logf("排列组合数量:%v 时长:%v",n,duration)
}
//结果
排列组合数量:3 时长:106.502µs
总结
第一点主要是解题思路,能迅速将问题对应到数学上的排列组合问题,初步思路就是三层for循环
第二点就是代码质量问题,因为三层for循环,循环次数累积相乘,当球数很大时,计算所消耗的时间很可怕,虽然只有3种组合方式,所以就针对题目特点,对第二层循环做了优化,第三层循环可以去掉,具体优化看代码,并不复杂
第三点就是对函数参数的边界检查,细心
三色球问题python_面试题-三色球问题相关推荐
- 三色球问题python_零基础入门学习Python习题3【输密码+水仙花数+摸三色球】
001 输密码 设计一个验证用户密码的程序,用户只有三次机会输入错误,不过,如果用户输入的内容里包含"*",则不算在次数内. count = 3 password = &quo ...
- Python_面试题
1.邮箱正则 import re r=re.findall("[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+","<&g ...
- 二叉树最大路径和 python_[面试题]二叉树中最大路径和
题目传送门:力扣leetcode-cn.com 昨天下午突然接到某公司算法岗面试,问到的算法题. 题目描述: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到 ...
- 包含min函数的栈 python_面试题_设计包含 min函数的栈
设计包含 min函数的栈() 定义栈的数据结构,要求添加一个 minminmin函数,能够得到栈的最小元素. 要求函数 min.push以及 pop 的时间复杂度都是 O(1). #include u ...
- python k近邻算法_python中的k最近邻居算法示例
python k近邻算法 K最近邻居(KNN) (K-Nearest Neighbors (KNN)) KNN is a supervised machine learning algorithm t ...
- 英语 动画 教学 字母_字母形式在阅读教学中的作用
英语 动画 教学 字母 Note: this essay may also be found on Design Observer. 注意:这篇文章也可以在 Design Observer 上找到 . ...
- java三色球问题_三色球问题,Java,算法
三色球问题.有红.黄.绿三种颜色的球,其中红球3个,黄球3个,绿球6个. 现将这12个球混放在一个盒子里,从中任意摸出8个球,编程计算摸出球的各种颜色搭配. public class Qiu { pu ...
- c语言课程设计三色球问题,C++三色球问题描述与算法分析
C++三色球问题描述与算法分析 本文实例讲述了C++三色球问题.分享给大家供大家参考,具体如下: /* * 作 者:刘同宾 * 完成日期:2012 年 11 月 15 日 * 版 本 号:v1.0 * ...
- 三色球问题python_Python:验证密码程序与水仙花数、三色球问题
验证密码程序 程序需求:设计一个验证用户密码程序,用户只有三次机会输入错误,不过如果用户输入的内容中包含"*"则不计算在内. 根据需求我们可以得知: 我们需要创建密码变量和次数变量 ...
最新文章
- 表转换存储引擎的方法总结
- 【Centos】CentOS7 安装 JDK11.0.3
- cacti安装配置详解_MySQL实战001:8.0免安装版服务配置详解
- 推荐系统经典论文学习
- c++ so 反射_c++如何实现反射功能?
- Javascript学习数据结构--字典
- oracle 数据库由Linux平台向Windows平台迁移
- 10分钟搞懂商业模式画布:9张分析图、6张模板
- mschart控件使用详解
- CSS 3之美化表格样式
- CPU的内部架构和工作原理(好文)
- Pandas读取csv
- 利用Jmeter进行压力测试(基础版)
- C# amr转mp3 (ffmpeg)
- Jedis scan及其count的值
- 智能空调雷达感应,雷达模组技术方案,毫米波雷达传感器应用
- 网上贵金属交易怎么操作?网上贵金属交易策略有哪些?
- 2019CSP-J组题目-加工零件
- ROS学习总结一:talker and listener
- php实现猫眼电影院选座思路,高仿猫眼电影选座(选票)模块