- 浏览: 41668 次
- 性别:
最新评论
题目:有A,B,C,D,E 5个字母,从其中任选3个,要求列出所有可能的组合
大家一定还记得高中的时候学过的组合C(m,n)算法吧。。那么我们就用这个算法来做这道题吧。
其实做出这道题有俩种方法,一种是递归的。比较容易一点。另外一种是非递归的。
递归的代码如下:
/* * 主要是利用递归来来实现。主要思想是把一个字符串分为俩段来处理,首先取出第一个字符串,然后用后面的字符来与它进行拼凑。 */ import java.util.Scanner; public class Zuhe { private static String str = "ABCDE";// 字符串 private static int n = 3;// 选择的个数 private static int count = 0;//组合的个数 public static void main(String[] args) { new Zuhe(); } Zuhe() { Scanner input = new Scanner(System.in); System.out.println("请输入要选择的个数(要少于" + str.length() + "个)"); n = Integer.parseInt(input.nextLine()); find("", 0); System.out.println("共有"+count+"种组合"); } /* *第一个参数是代表第一个字符,第二个参数代表开始寻找点的位置 */ public static void find(String s, int i) { // 保存上一次的字符串 String temp = s; //判断是否符合要求 if (s.length() == n) { count++; System.out.print(s + " "); if (count % 10 == 0) System.out.println(); return; } //从寻找点开始循环, for (int k =i; k < str.length(); k++) { s = temp; s += str.charAt(k); find(s, k+1); } } }
非递归的代码如下:
/* * 采用了图的广度优先算法。也可以说利用队列来实现。先进先出。首先取出第一个字母。然后入队、。 * 开始循环,出队。循环的结束条件的只要队列还有元素就就循环没有结束。进入循环之后,先判断元素是否符合 * 要求,如果符合就输出。如果不符合,就给它追加一个字母,开始点是由它的最后一个字符来决定。 * 比如说:是A就从0开始,是B就从1开始。(这里是难点。)一直找到字符串的末尾。找完之后就 * 去除取出来的这个元素。以此类推。。。 */ import java.util.ArrayList; import java.util.Scanner; public class Zuhe { public static void main(String[] args) { String str = "ABCDE";// 字符串 int n = 2;// 选择的个数 int count = 0;// 组合的总数 Scanner input = new Scanner(System.in); System.out.println("请输入要选择的个数(要少于" + str.length() + "个)"); n = Integer.parseInt(input.nextLine()); ArrayList<String> arr = new ArrayList<String>();//模拟队列 for (int k = 0; k < str.length(); k++) { //取出首节点 String s = str.charAt(k) + ""; //入队 arr.add(s); //开始循环 while (arr.size() > 0) { //出队 String ss = arr.get(0); //判断是否符合要求 if (ss.length() == n) { System.out.print(ss + " "); count++; if (count % 10 == 0) System.out.println(); } //追加字符。 for (int i = str.indexOf(ss.charAt(ss.length() - 1))+1; i < str.length(); i++) { if (ss.length() < n) { String m = ss + str.charAt(i); arr.add(m); } } //去除取出来的节点。 arr.remove(0); } } System.out.println("共有" + count + "种组合"); } }
结果的输出效果:
请输入要选择的个数(要少于5个)
3
ABC ABD ABE ACD ACE ADE BCD BCE BDE CDE
共有10种组合
发表评论
-
2012-03-16 20:52 最大公约数;最小公倍数
2012-05-18 21:45 1370求最小公倍数方法如下: (1)、两数相乘法。 ... -
裴波那契算法
2012-05-18 21:40 883裴波那契算法,数组算法 #include<st ... -
一些的算法的格式
2012-05-17 12:15 1084做题目做久了之后就会发现,算法是有格式的。 一、深度优 ... -
第三届蓝桥杯预赛真题-C++本科组-10题(Java实现)
2012-05-15 11:11 973今盒子里有n个小球,A、B两人轮流从盒中取球,每个 ... -
第三届蓝桥杯预赛真题-C++高职组-10题(Java实现)
2012-05-15 10:57 12802x3=6个方格中放入ABCDE五个字母,右下角的那个 ... -
第三届蓝桥杯预赛真题-Java高职组-10题
2012-05-14 13:16 1990匪警请拨110,即使手机欠 ... -
第三届蓝桥杯预赛真题-Java本科组-10题
2012-05-14 12:41 1521泊松是法国数学家、物理学家和力学家。他一生致力科学事 ... -
八皇后-位运算版
2012-01-12 18:38 1241八皇后问题,是一 ... -
计算24点-利用二叉树原理
2012-01-10 21:03 1657问题描述80年代全世界流行一种数字游戏,在中国我们把这种游戏称 ... -
吸血鬼数字
2012-01-09 20:32 941题目: 吸血鬼数字是 ... -
字符串的排列(A(m,n)),可重复选
2012-01-09 13:28 1311题目:现有ABCDE 5个球 构成的排列组合 可重复抽取 最多 ... -
蛇形矩阵
2012-01-09 13:38 1056Problem蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上 ... -
寻找最短路径
2012-01-07 18:51 1176题目:给定一个起点和一个终点。在一个8*8的棋盘上找出一条最短 ... -
字符串的排列(A(m,n))
2012-01-07 18:18 988题目:有A,B,C,D,E 5个字母,从其中任选3个,要求列出 ... -
汉诺塔
2012-01-07 17:32 972关于汉诺塔大家应该很熟悉吧。 河內之塔(Towers ... -
三角螺旋矩阵
2012-01-07 17:27 1119打印如下矩阵,如果 n=7 则输出: 1 18 2 ...
相关推荐
总结来说,字符串组合问题可以通过递归和位运算两种方式在C语言中实现。递归方法直观且易于理解,但可能涉及到大量的函数调用,而位运算方法虽然需要对二进制有一定的理解,但效率更高且占用更少的内存。在实际应用...
9. **字符串转化数字以及数字转化字符串**:在C/C++中,可以使用`atoi()`将字符串转换为整数,`atof()`转换为浮点数,而`itoa()`和`sprintf()`可以将数字转换为字符串。在其他语言如Python中,有内置的`int()`和`str...
字符串的全排列和组合算法是计算机科学中的一种基础算法,主要应用于数据处理和问题求解。在本文档中,我们将探讨如何使用C++实现字符串的全排列算法,并讨论如何处理包含重复字符的情况。 首先,全排列是指从一个...
正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串中字符组合的模式。它广泛应用于文本处理、数据验证、搜索与替换等领域。 正则表达式的基本组成: 普通字符:直接匹配的字符,如 a, b, 1, # 等。...
js 随机生成字母数字组合的字符串随机动画数字 js 随机生成字母数字组合的字符串是指使用 JavaScript 语言生成一个随机的字母数字组合的字符串,用于各种需要随机字符串的地方。该字符串可以是包含数字、字母或符号...
正则表达式(Regular Expression),简称为regex,是一种强大的文本处理工具,常用于字符串的匹配、查找、替换等操作。它通过一种模式来定义字符串的规则,从而实现对特定格式的字符串进行验证和处理。在编程中,...
2. 组合(Combination):当m个元素的顺序不重要时,组合的总数为C(n, m) = n! / [m!(n-m)!]。 易语言提供的这个排列组合模块,很可能是通过递归或动态规划方法实现的。递归算法通常基于基础情况(即m=1或n=m的情况...
private final static String[] lc_FirstLetter = {"a", "b", "c", "d", "e", "f", "g", "h", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "w", "x", "y", "z"}; // 获取整个字符串中所有汉字的拼音...
正则表达式是一种强大的文本处理工具,用于验证字符串、查找特定模式和替换字符串。它通过一套规则和特殊字符来描述字符串的模式,从而实现高效、灵活的文本操作。 首先,正则表达式的基本功能包括: 1. 验证字符...
C语言中的转义字符是指在字符常量或字符串中使用的一些特殊字符,以表达一些不可见或不可打印的字符。这些字符在ASC II码表中有着特定的含义,以下是常用的转义字符: * \o 空字符 (NULL) :00H/0 * \n 换行符 (LF)...
例如,在给定的示例中,`String.Format("item {0} sells at {1:C}", x, y)`将整数`x`和货币值`y`插入到字符串中,其中`{0}`代表第一个参数`x`,`{1:C}`代表第二个参数`y`并将其格式化为货币样式。 `{N}`中的`N`是一...
格式字符串的基本结构是`"{N[,M][:formatString]}"`,其中: - `N`是参数的索引,从0开始。 - `M`(可选)是宽度指定器,决定输出的最小宽度,正数表示右对齐,负数表示左对齐。 - `formatString`(可选)是具体的...
对于可变长度的字符串,如C语言中的字符串,其长度不是固定的,而是由最后一个非空字符后的空字符来标识。 数组和字符串的特性使得它们在很多算法中不可或缺,如排序、搜索、动态规划等。理解和掌握这些基础知识是...
- `split()` 方法按指定分隔符分割字符串成列表,`split('b')` 将字符串 'abcbdbf' 分割为 ['a', 'c', 'd', 'f']。 - `count(sub)` 统计子字符串出现次数,`replace(old, new)` 替换子字符串,`center(width[, ...
### 字符串问题蓝桥杯知识点详解 #### 一、字符统计问题 ##### 1. 问题描述 在本问题中,我们需要处理一个输入的字符串,并统计其中各个大写字母出现的频率。最终目的是找到出现次数最多的字母。由于只考虑大写...
通过组合这些元素,我们可以构建出能够匹配各种复杂字符串模式的表达式。 在"解析字符串"的过程中,我们通常会用到以下几种正则表达式概念: 1. **匹配模式**:如`\w+`匹配任何单词字符(等同于[a-zA-Z0-9_]),`\...
正则表达式(Regular Expression)是一种强大的文本处理工具,它由一些特殊字符组成,用于匹配、查找、替换符合特定模式的字符串。在信息技术领域,正则表达式被广泛应用在数据验证,如表单验证,URL解析,日志分析...
这些题目涵盖了C语言的基础知识点,包括输入输出、函数声明与定义、条件判断、循环控制、数组、字符串处理、算术运算以及逻辑运算等。以下是针对每个题目涉及的主要知识点的详细解释: 1. 求最大公约数(Greatest ...
- 需要遍历字符串数组,同时考虑字符串长度限制`N`和字符串数量`M`。 以上五个题目均体现了C语言基础编程技能和问题解决能力,包括基本的数据类型、控制结构、字符串处理、数组操作和简单的算法设计。通过这些实验...