本文作者 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_面试题-三色球问题相关推荐

  1. 三色球问题python_零基础入门学习Python习题3【输密码+水仙花数+摸三色球】

    001   输密码 设计一个验证用户密码的程序,用户只有三次机会输入错误,不过,如果用户输入的内容里包含"*",则不算在次数内. count = 3 password = &quo ...

  2. Python_面试题

    1.邮箱正则 import re r=re.findall("[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+","<&g ...

  3. 二叉树最大路径和 python_[面试题]二叉树中最大路径和

    题目传送门:力扣​leetcode-cn.com 昨天下午突然接到某公司算法岗面试,问到的算法题. 题目描述: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到 ...

  4. 包含min函数的栈 python_面试题_设计包含 min函数的栈

    设计包含 min函数的栈() 定义栈的数据结构,要求添加一个 minminmin函数,能够得到栈的最小元素. 要求函数 min.push以及 pop 的时间复杂度都是 O(1). #include u ...

  5. python k近邻算法_python中的k最近邻居算法示例

    python k近邻算法 K最近邻居(KNN) (K-Nearest Neighbors (KNN)) KNN is a supervised machine learning algorithm t ...

  6. 英语 动画 教学 字母_字母形式在阅读教学中的作用

    英语 动画 教学 字母 Note: this essay may also be found on Design Observer. 注意:这篇文章也可以在 Design Observer 上找到 . ...

  7. java三色球问题_三色球问题,Java,算法

    三色球问题.有红.黄.绿三种颜色的球,其中红球3个,黄球3个,绿球6个. 现将这12个球混放在一个盒子里,从中任意摸出8个球,编程计算摸出球的各种颜色搭配. public class Qiu { pu ...

  8. c语言课程设计三色球问题,C++三色球问题描述与算法分析

    C++三色球问题描述与算法分析 本文实例讲述了C++三色球问题.分享给大家供大家参考,具体如下: /* * 作 者:刘同宾 * 完成日期:2012 年 11 月 15 日 * 版 本 号:v1.0 * ...

  9. 三色球问题python_Python:验证密码程序与水仙花数、三色球问题

    验证密码程序 程序需求:设计一个验证用户密码程序,用户只有三次机会输入错误,不过如果用户输入的内容中包含"*"则不计算在内. 根据需求我们可以得知: 我们需要创建密码变量和次数变量 ...

最新文章

  1. 表转换存储引擎的方法总结
  2. 【Centos】CentOS7 安装 JDK11.0.3
  3. cacti安装配置详解_MySQL实战001:8.0免安装版服务配置详解
  4. 推荐系统经典论文学习
  5. c++ so 反射_c++如何实现反射功能?
  6. Javascript学习数据结构--字典
  7. oracle 数据库由Linux平台向Windows平台迁移
  8. 10分钟搞懂商业模式画布:9张分析图、6张模板
  9. mschart控件使用详解
  10. CSS 3之美化表格样式
  11. CPU的内部架构和工作原理(好文)
  12. Pandas读取csv
  13. 利用Jmeter进行压力测试(基础版)
  14. C# amr转mp3 (ffmpeg)
  15. Jedis scan及其count的值
  16. 智能空调雷达感应,雷达模组技术方案,毫米波雷达传感器应用
  17. 网上贵金属交易怎么操作?网上贵金属交易策略有哪些?
  18. 2019CSP-J组题目-加工零件
  19. ROS学习总结一:talker and listener
  20. php实现猫眼电影院选座思路,高仿猫眼电影选座(选票)模块

热门文章

  1. oracle sparc t5-2报价,SPARC T5-2服务器
  2. 自动取款机 冲正交易
  3. 打印机与计算机接口大多数,打印机接口-西北师范大学.PPT
  4. 如何在CSDN个人主页添加公众号或者个人微信二维码
  5. 《 指数基金投资指南 》by 银行螺丝钉 - 笔记 - 1、2章
  6. Animator.paly 跳到动画结束
  7. 迄今见过的最好的职业规划文章
  8. python 判断字符串中的的起始、终止子字符串
  9. 2018新年庙会归来
  10. Idempotent Consumer