黑马程序员技术交流社区
标题: 【3个技术分】就业指导-王震阳老师3个技术分题的思路 [打印本页]
作者: 沿途小将 时间: 2014-8-13 23:29
标题: 【3个技术分】就业指导-王震阳老师3个技术分题的思路
本帖最后由 沿途小将 于 2014-8-16 13:39 编辑
题目链接如下:点击跳入题目获取帖
借用阳哥的字(谢谢啦!阳哥):
活动目的:练习javaSE知识,算法题。
活动奖励:最高3个技术分
结束时间:2014年8月15日,过期提交可能获取不到技术分!
代码提交要求:将自己的源代码压缩然后提交,提交的时候设置为管理员权限,以其他方式提交的答案无效。上交源码的时候不需要将整个工程项目压缩,只需将用到的源文件压缩即可。
题目类型:JavaSE 排列组合算法。
难易程度:容易
我的解决思路:
第一步:用Scnner的方式建立一个数组。
第二步:敲一个函数实现老师的要求(排列组合)。
因为这里的题目类型是JavaSE排列组合算法,我认为老师还是重点让大家联系第二步的。故我在这只分享我第二步的思路,要得到数组里的全部元素的所有排列组合,每个人有每个人的方法。我的方法是:数组里每个元素都是从array[0],array[1]...array循环了一个,并把每一个新的数组打印,草图如下:
- </blockquote></div>部分代码如下:</span></div><div><span style="font-size: large; line-height: 2.2em;"><div class="blockcode"><blockquote>for (int t = 0; t < i; t++) {
- int a = 0;
- for (int j = 0; j < i; j++) {
- if (j != t) {
- a = arr[j];
- arr[j] = arr[t];
- arr[t] = a;
- }
- for (int n = 0; n < i; n++) {
- System.out.print(arr[n]);
- }
- System.out.println();
- }
- }
复制代码
希望对大家在获取那3技术分时有所帮助(抄袭没分呦,亲!)
作者: fxwb2005 时间: 2014-8-14 00:04
这题我也做了很久,还是没搞出来,用递归做,算法有点复杂。
作者: fantacyleo 时间: 2014-8-14 00:17
怎么又是这个题,之前被讨论过无数遍了。。。来一个增强版的
- import java.util.ArrayList;
- /*
- * 输入N个字符,如'a','b','c',打印出所有组合
- * a b c
- * ab ac bc ba bc cb
- * abc acb bac bca cba cab
- *
- * 思路:
- * 长度为n的字符串排列,是长度为n-1的每个字符串排列的末尾加上一个字符
- * 比如,abc是由ab末尾加c得到的;acb是由ac末尾加c得到的。
- * 因此,用一个ArrayList不断添加已得到的排列结果。当要排列长度为n的字符串时,让两个指针分别指向长度为n-1的排列在结果集合中的起止下标
- */
- public class PermuteAllLength {
- public static void main(String[] args) {
- String s = "123";
- printPermute(s);
- }
-
- public static void printPermute(String str) {
- char[] candidates = str.toCharArray();
- int len = str.length();
- ArrayList<String> permutations = new ArrayList<String>(); // 存储排列结果
- // 长度为1的排列,直接添加
- for (char c : candidates) {
- permutations.add(Character.toString(c));
- }
-
- // 下标指针,分别指向长度为1的字符串排列的起止位置
- int start = 0;
- int end = permutations.size();
- // 长度2到len的排列,用循环完成
- for (int i = 2; i <= len; i++) {
- // 下面的二重循环,外层循环遍历长度为n-1的每一个字符串排列
- for (; start < end; start++) {
- String s = permutations.get(start);
- // 内层循环则尝试在长度为n-1的字符串排列的尾部添加一个字符,形成一个长度为n的字符串
- for (char c : candidates) {
- // 只添加不重复的字符
- if (s.indexOf(c) == -1)
- permutations.add(s + c);
- }
- }
- // 经过循环,start已经指向长度为n-1的字符串排列在结果集合中的起始位置
- // 现在让end指向指向长度为n-1的字符串排列在结果集合中的终止位置
- end = permutations.size();
- // 开始下一次循环,处理长度为n的字符串排列
- }
-
- // 打印结果集合及其元素个数
- System.out.println(permutations);
- // System.out.println(permutations.size());
-
- }
- }
复制代码
作者: 沿途小将 时间: 2014-8-14 07:53
import java.util.*;
/**
* 将一组数字、字母或符号进行排列,以得到不同的组合顺序, 例如1 2 3这三个数的排列组合有:1 2 3、1 3 2、2 1 3、2 3 1、3 1 2、3
* 2 1。 要求:用户输入一个整数(0到9)数组(数组长度大于等于3,小于10), 那么请在控制台打印出该数组中所有成员的排列组合
*/
public class MyDemo {
int i = 0;// 数组长度
boolean b = false;
int[] arr;
public static void main(String[] args) {
new MyDemo().Comb();
}
public MyDemo() {
System.out.println("您想要几位数进行排列组合?(亲,这个数的范围是3<=X<10)");
Scanner arrlong = new Scanner(System.in);
i = arrlong.nextInt();
if (i >= 3 && i < 10) {
arr = new int;
for (int j = 0; j < i; j++) {
int a = j + 1;
System.out.println("请输入第" + a + "个数!");
Scanner sc = new Scanner(System.in);
arr[j] = sc.nextInt();
}
b = true;
} else {
System.out.println("亲,你调皮啦!输入的数不合法哦!");
b = false;
}
}
public void Comb() {
if (b) {
for (int t = 0; t < i; t++) {
int a = 0;
for (int j = 0; j < i; j++) {
if (j != t) {
a = arr[j];
arr[j] = arr[t];
arr[t] = a;
}
for (int n = 0; n < i; n++) {
System.out.print(arr[n]);
}
System.out.println();
}
}
}
}
}
作者: 沿途小将 时间: 2014-8-14 07:54
- import java.util.*;
- /**
- * 将一组数字、字母或符号进行排列,以得到不同的组合顺序, 例如1 2 3这三个数的排列组合有:1 2 3、1 3 2、2 1 3、2 3 1、3 1 2、3
- * 2 1。 要求:用户输入一个整数(0到9)数组(数组长度大于等于3,小于10), 那么请在控制台打印出该数组中所有成员的排列组合
- */
- public class MyDemo {
- int i = 0;// 数组长度
- boolean b = false;
- int[] arr;
- public static void main(String[] args) {
- new MyDemo().Comb();
- }
- public MyDemo() {
- System.out.println("您想要几位数进行排列组合?(亲,这个数的范围是3<=X<10)");
- Scanner arrlong = new Scanner(System.in);
- i = arrlong.nextInt();
- if (i >= 3 && i < 10) {
- arr = new int[i];
- for (int j = 0; j < i; j++) {
- int a = j + 1;
- System.out.println("请输入第" + a + "个数!");
- Scanner sc = new Scanner(System.in);
- arr[j] = sc.nextInt();
- }
- b = true;
- } else {
- System.out.println("亲,你调皮啦!输入的数不合法哦!");
- b = false;
- }
- }
- public void Comb() {
- if (b) {
- for (int t = 0; t < i; t++) {
- int a = 0;
- for (int j = 0; j < i; j++) {
- if (j != t) {
- a = arr[j];
- arr[j] = arr[t];
- arr[t] = a;
- }
- for (int n = 0; n < i; n++) {
- System.out.print(arr[n]);
- }
- System.out.println();
- }
- }
- }
- }
- }
复制代码
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |