有1、2、3、4个数字,能组成多少个互不相同 且无重复数字的三位数?都是多少?...
前言
今天看到一个超级简单的算法题,但是我当时思路往递归,逐级筛选里面想了。结果百度查查答案,超级简单。
真是惭愧惭愧,不过我还是坚持用递归实现了,因为用递归的方案,可以适用于任何给定数据和指定位数。
传统解法
如下所示,因为题目是找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,2,3,4个数字, 能组成多少个互不相同且无重复数字的三位数? 都是多少?
程序算法精题–JS版 有1,2,3,4个数字, 能组成多少个互不相同且无重复数字的三位数? 都是多少? 分析 百十个位数字都可以是1, 2, 3, 4 组成所有的排列后在去掉不满足条件的排列: 无重复 ...
- 用1、3、5、7 这4 个数字,能组成的互不相同且无重复数字的三位数有哪些?共有多少个?这些数的和为多少?
#用1.3.5.7 这4 个数字,能组成的互不相同且无重复数字的三位数有哪些?共有多少个?这些数的和为多少?a={1,3,5,7} total=0 list = [] sum=0; for i in ...
- python(四个数字能生成多少个互不相同且无重复数字的三位数,实现命令行提示符)
四个数字能生成多少个互不相同且无重复数字的三位数: """ 有1,2,3,4四个数字 求这四个数字能生成多少个互不相同且无重复数字的三位数 ""&qu ...
- matlab怎么重复一个数字,有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?用matlab编程怎么编...
% 排列运算:从 n 个元素中取出 r 个的排列 function [pct,P] = my_P(n,r) % pct: 排列总数 % P: 排列列表 pct = 0; P = []; if narg ...
- 有1,2,3,4四个数字,能组成多少个互不相同且无重复数字的三位数 都是多少
有1,2,3,4四个数字,能组成多少个互不相同且无重复数字的三位数 都是多少 /*** 有1.2.3.4四个数字,能组成多少个互不相同且无重复数字的三位数 都是多少* * @author wql* * ...
- Python 案例001 (有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数)...
题目内容来自网络 ,加入了个人理解的过程 ,和点评 #!/usr/bin/python # -*- coding: UTF-8 -*-#Author : Wumi#题目:有四个数字:1.2.3.4,能 ...
- C语言九十七之实现有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?并且输出多少个
1.题目 实现有 1.2.3.4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?并且输出多少个 分析: 可填在百位.十位.个位的数字都是 1.2.3.4.组成所有的排列后再去掉不满足条件 ...
- 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数
有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数? 步骤:先定一个函数,把数据储存在一个列表,然后传入函数中就行了 代码 def threeDN(a):'''组成多少个互不相同且无重复 ...
- * 有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数? * 把这些数都输出出来,并且输出总共的个数。
package Day03;import java.util.ArrayList;/*** 第五题:* 有1.2.3.4四个数字,能组成多少个互不相同且无重复数字的三位数?* 把这些数都输出出来,并且 ...
- 有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
题目:有 1.2.3.4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数字都是 1.2.3.4,组成所有的排列后再去掉不满足条件的排列. #i ...
最新文章
- Python - 3.6 学习三
- AngularJs+bootstrap搭载前台框架——准备工作
- __METHOD__
- 牛客网 【每日一题】5月20日题目 简单瞎搞题
- Java开发环境!我总结了所有面试题
- (原創) Verilog入門書推薦2:數位系統實習 Quartus II (SOC) (Verilog)
- 人人都能够做深度学习应用:入门篇
- 青灯教育python免费公开课_如何使用Python爬取抖音APP视频
- 局域网传输文件_如何“互传文件”?简单几步,方便快捷
- docker安装禅道
- 山东大学软件学院概率论与数理统计(考试)——期末考试回忆版
- php判断手机浏览器,php判断是不是手机浏览器访问
- window10运行不了1stopt_1stopt win10版下载
- mysql连接失败问题
- MySQL函数 if 的使用
- 《Android深度探索卷一》读书笔记六
- Spring Boot 自定义注解支持EL表达式(基于 MethodBasedEvaluationContext 实现)
- python二级准备一个月能行吗_计算机二级选哪个?一个多月的准备时间够吗?
- Android 获取联系人姓名与电话号码
- seleniumbase学习总结4 - 运行测试用例
热门文章
- 学生护眼台灯aa和a的区别?分享适合学生的护眼台灯
- Javascript中append和appendChild有什么不同?
- leaflet绘制图形,wkt模式与geoJson互转
- 系列报道 | 组织范式“青色组织”兴起:员工骨子里透出愉悦积极气质
- XML中PCDATA与CDATA的区别
- IntelliJ IDEA|热部署
- 大数据三个特点的理解
- 正则表达式 Exel单元格
- 用于高频接收器和发射器的锁相环(PLL)——第一部分 PLL的基本概念
- 计算机管理 服务无响应,电脑任务栏假死点击没反应的解决方法(win7与xp)