前言

今天看到一个超级简单的算法题,但是我当时思路往递归,逐级筛选里面想了。结果百度查查答案,超级简单。
真是惭愧惭愧,不过我还是坚持用递归实现了,因为用递归的方案,可以适用于任何给定数据和指定位数。

传统解法

如下所示,因为题目是找1、2、3、4组合的三位数,因此可以用三重循环,遍历所有组合,筛选不重复组合即可。
但是该方案,如果给定数据改变,组合位数改变,那代码就得大改,所以不是一个通用的好方法。

func useNormal() []int {var ret []intfor i := 1; i < 5; i++ {for j := 1; j < 5; j++ {for k := 1; k < 5; k++ {if i != j && j != k && i != k {ret = append(ret, i*100+j*10+k)}}}}return ret
}

递归求解

下面方案是通过递归,依次为某一位分配数字,并将剩余组合依次赋值下一位。
该方法只需要改变data数据,以及numLen的指定位数就可以灵活地计算所有组合。

func useRecursion() []int {var (data   = []int{1, 2, 3, 4}numLen = 3tmp    = make([]int, numLen)ret    []int)findNum(data, tmp, numLen, &ret)return ret
}func findNum(data, tmp []int, dep int, ret *[]int) {for i, v := range data {if dep--; dep < 0 {sum := 0for i := len(tmp) - 1; i >= 0; i-- {sum = sum*10 + tmp[i]}*ret = append(*ret, sum)return}tmp[dep] = v // 当前选择赋值next := make([]int, 0, len(data))next = append(next, data[:i]...)next = append(next, data[i+1:]...)findNum(next, tmp, dep, ret) // 剔除当前元素,进入下一级筛选dep++}
}

完整代码

执行结果如下,两种方案结果完全一致:

[123 124 132 134 142 143 213 214 231 234 241 243 312 314 321 324 341 342 412 413 421 423 431 432] 24[123 124 132 134 142 143 213 214 231 234 241 243 312 314 321 324 341 342 412 413 421 423 431 432] 24

package mainimport "fmt"func main() {ret0 := useNormal()fmt.Println(ret0, len(ret0))ret1 := useRecursion()fmt.Println(ret1, len(ret1))
}func useNormal() []int {var ret []intfor i := 1; i < 5; i++ {for j := 1; j < 5; j++ {for k := 1; k < 5; k++ {if i != j && j != k && i != k {ret = append(ret, i*100+j*10+k)}}}}return ret
}func useRecursion() []int {var (data   = []int{1, 2, 3, 4}numLen = 3tmp    = make([]int, numLen)ret    []int)findNum(data, tmp, numLen, &ret)return ret
}func findNum(data, tmp []int, dep int, ret *[]int) {for i, v := range data {if dep--; dep < 0 {sum := 0for i := len(tmp) - 1; i >= 0; i-- {sum = sum*10 + tmp[i]}*ret = append(*ret, sum)return}tmp[dep] = v // 当前选择赋值next := make([]int, 0, len(data))next = append(next, data[:i]...)next = append(next, data[i+1:]...)findNum(next, tmp, dep, ret) // 剔除当前元素,进入下一级筛选dep++}
}

总结

凡事有简单方案,也有复杂方案,简单往往不能通用,多想想通用方案,尝试解决一类问题而不是某一个问题。

有1、2、3、4个数字,能组成多少个互不相同 且无重复数字的三位数?都是多少?...相关推荐

  1. 1. 有1,2,3,4个数字, 能组成多少个互不相同且无重复数字的三位数? 都是多少?

    程序算法精题–JS版 有1,2,3,4个数字, 能组成多少个互不相同且无重复数字的三位数? 都是多少? 分析 百十个位数字都可以是1, 2, 3, 4 组成所有的排列后在去掉不满足条件的排列: 无重复 ...

  2. 用1、3、5、7 这4 个数字,能组成的互不相同且无重复数字的三位数有哪些?共有多少个?这些数的和为多少?

    #用1.3.5.7 这4 个数字,能组成的互不相同且无重复数字的三位数有哪些?共有多少个?这些数的和为多少?a={1,3,5,7} total=0 list = [] sum=0; for i in ...

  3. python(四个数字能生成多少个互不相同且无重复数字的三位数,实现命令行提示符)

    四个数字能生成多少个互不相同且无重复数字的三位数: """ 有1,2,3,4四个数字 求这四个数字能生成多少个互不相同且无重复数字的三位数 ""&qu ...

  4. matlab怎么重复一个数字,有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?用matlab编程怎么编...

    % 排列运算:从 n 个元素中取出 r 个的排列 function [pct,P] = my_P(n,r) % pct: 排列总数 % P: 排列列表 pct = 0; P = []; if narg ...

  5. 有1,2,3,4四个数字,能组成多少个互不相同且无重复数字的三位数 都是多少

    有1,2,3,4四个数字,能组成多少个互不相同且无重复数字的三位数 都是多少 /*** 有1.2.3.4四个数字,能组成多少个互不相同且无重复数字的三位数 都是多少* * @author wql* * ...

  6. Python 案例001 (有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数)...

    题目内容来自网络 ,加入了个人理解的过程 ,和点评 #!/usr/bin/python # -*- coding: UTF-8 -*-#Author : Wumi#题目:有四个数字:1.2.3.4,能 ...

  7. C语言九十七之实现有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?并且输出多少个

    1.题目 实现有 1.2.3.4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?并且输出多少个 分析: 可填在百位.十位.个位的数字都是 1.2.3.4.组成所有的排列后再去掉不满足条件 ...

  8. 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数

    有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数? 步骤:先定一个函数,把数据储存在一个列表,然后传入函数中就行了 代码 def threeDN(a):'''组成多少个互不相同且无重复 ...

  9. * 有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数? * 把这些数都输出出来,并且输出总共的个数。

    package Day03;import java.util.ArrayList;/*** 第五题:* 有1.2.3.4四个数字,能组成多少个互不相同且无重复数字的三位数?* 把这些数都输出出来,并且 ...

  10. 有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

    题目:有 1.2.3.4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数字都是 1.2.3.4,组成所有的排列后再去掉不满足条件的排列. ​ #i ...

最新文章

  1. Python - 3.6 学习三
  2. AngularJs+bootstrap搭载前台框架——准备工作
  3. __METHOD__
  4. 牛客网 【每日一题】5月20日题目 简单瞎搞题
  5. Java开发环境!我总结了所有面试题
  6. (原創) Verilog入門書推薦2:數位系統實習 Quartus II (SOC) (Verilog)
  7. 人人都能够做深度学习应用:入门篇
  8. 青灯教育python免费公开课_如何使用Python爬取抖音APP视频
  9. 局域网传输文件_如何“互传文件”?简单几步,方便快捷
  10. docker安装禅道
  11. 山东大学软件学院概率论与数理统计(考试)——期末考试回忆版
  12. php判断手机浏览器,php判断是不是手机浏览器访问
  13. window10运行不了1stopt_1stopt win10版下载
  14. mysql连接失败问题
  15. MySQL函数 if 的使用
  16. 《Android深度探索卷一》读书笔记六
  17. Spring Boot 自定义注解支持EL表达式(基于 MethodBasedEvaluationContext 实现)
  18. python二级准备一个月能行吗_计算机二级选哪个?一个多月的准备时间够吗?
  19. Android 获取联系人姓名与电话号码
  20. seleniumbase学习总结4 - 运行测试用例

热门文章

  1. 学生护眼台灯aa和a的区别?分享适合学生的护眼台灯
  2. Javascript中append和appendChild有什么不同?
  3. leaflet绘制图形,wkt模式与geoJson互转
  4. 系列报道 | 组织范式“青色组织”兴起:员工骨子里透出愉悦积极气质
  5. XML中PCDATA与CDATA的区别
  6. IntelliJ IDEA|热部署
  7. 大数据三个特点的理解
  8. 正则表达式 Exel单元格
  9. 用于高频接收器和发射器的锁相环(PLL)——第一部分 PLL的基本概念
  10. 计算机管理 服务无响应,电脑任务栏假死点击没反应的解决方法(win7与xp)