黑马程序员技术交流社区
标题:
求这个程序怎么写?
[打印本页]
作者:
孤影卓尔
时间:
2014-2-24 17:15
标题:
求这个程序怎么写?
给定整数n(0<n<10),求1-n的全排列,例如给定3,全排列为123、132、213、231、312、321
作者:
丶小天
时间:
2014-2-24 17:37
就把算法给你写一下:
for(int i = 1;i<=n;i++)
for(int j = 1;j<=n;j++)
for(int k = 1;k<=n;k++)
{
if(i==j || i==k || j==k)
continue;
else
System.out.println(i*100+j*10+k);
}
作者:
syw02014
时间:
2014-2-24 20:37
这样我想应该也可以:
#include <stdio.h>
#include <stdlib.h>
#define maxN 10
void permutation(int n,int arry[],int Arry_n)
{
if(Arry_n==n)
{
int i=0;
for(;i<n;++i)
printf("%d\t",arry[i]);
printf("\n");
}
int iwhich=1;
for(;iwhich<=n;++iwhich)
{
bool PDuan_InArry=false;
int temp=0;
for(;temp<Arry_n;++temp)
{
if(iwhich==arry[temp])
{
PDuan_InArry=true;
break;
}
}
if(false==PDuan_InArry)
{
arry[Arry_n]=iwhich;
permutation(n,arry,Arry_n+1);
}
}
}
void main()
{
int arry[maxN]={-1};
permutation(maxN,arry,0);
}
复制代码
作者:
我要的幸福呢
时间:
2014-2-24 21:07
这是我的一种实现方法
import java.util.TreeSet;
import java.util.Set;
public class FullPermutationDemo {
/**
* @param args
* 需求:给定整数n(0<n<10),求1-n的全排列,例如给定3,全排列为123、132、213、231、312、321
*
* 思路:采用递归的思想,先获得n-1的全排列,再利用n-1的全排列获得n的全排列
*
* 注:采用TreeSet存储数据是因为其默认实现
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<String> set = fullPermutation(3);
for(String s : set)
System.out.println(s);
}
public static TreeSet<String> fullPermutation(int n)
{
if(n<1||n>9)//指定范围
throw new RuntimeException("必须是大于0并且小于10的整数");
//创建TreeSet,用来存储全排列得到的字符串
TreeSet<String> set = new TreeSet<String>();
if(n==1)//如果n等于1,就将1存入set中
set.add(n+"");
else {
/*
* 如果n不等于1,就先获取n-1的所有全排列类型,然后再每一种n-1全排列的所有位置上
* 插入n,在一个位置上插入一次n就构成一个n的全排列
* 例如:2的全排列类型有12、21,可以看成_1_2_,_2_1_,在每一个下划线的位置上
* 分别放一个3,就构成了所有3的全排列,以此类推
*/
TreeSet<String> subSet = fullPermutation(n-1);//获取存储n-1的全排列的TreeSet
for(String s : subSet) {//遍历每一种n-1的全排列类型
for(int i = 0; i<=s.length(); i++) {
StringBuilder sb = new StringBuilder(s);//利用s构造StringBuilder,方便插入n
if(i==s.length())//如果i等于字符串长度,则将n放到最后一个位置,因为在这个位置上不能使用insert,所以必须判断
sb.append(n);
else
sb.insert(i, n);//在第i个位置上插入n
set.add(sb.toString());//获得一种全排列类型并存入TreeSet中
sb = null;//断开引用,等待垃圾回收
}
}
}
return set;
}
}
复制代码
作者:
qqwwdr
时间:
2014-2-24 21:36
我采用了递归的方式求这个全组合:
import java.util.*;
public class Num_Seria{
public static void main(String[] args){
//从键盘输入0-9 之间的一个数字,在这里偷懒没有对n进行输入检查
System.out.println("请输入0-9之间的一个数字");
Scanner s = new Scanner(System.in);
int n = -1;
if(s.hasNext()){
n = s.nextInt();
}
//将 1 - n 之间的数字按顺序存入集合 data中
ArrayList<Integer> data = new ArrayList<Integer>();
for(int i = n; i>0; i--){
data.add(new Integer(i));
}
//调用递归方法打印全组合
sort(data, new ArrayList<Integer>(), n);
}
private static void sort(List<Integer> datas,List<Integer> target, int num) {
//如果临时集合中的元素个数等于num时,表示得到了一个组合,打印该组合
if (target.size() == num) {
for(Integer i : target){
System.out.print(i);
}
System.out.print("\t");
}
//递归调用
for (int i = 0; i < datas.size(); i++) {
List newDatas = new ArrayList(datas);
List newTarget = new ArrayList(target);
newTarget.add(newDatas.remove(i));
sort(newDatas, newTarget, num);
}
}
}
复制代码
测试通过,可以达到效果
作者:
qqwwdr
时间:
2014-2-25 09:40
关于全组合的问题,
我在基础测试题中碰到了一个
(主要是测试题提交之后才感觉需要重写,然后重新优化了下代码)
需求:
编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
例如:
原始字符串是"abc",打印得到下列所有组合情况
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Test5_pro {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个长度大于1的字符串:");
if (scanner.hasNext()) {
String str = scanner.next();
if (str != null && str.length() > 1) {
printAllStr(str);
} else {
System.out.println("请输入一个长度大于1的字符串:");
}
}
}
private static void printAllStr(String str) {
ArrayList<String> arrayList = new ArrayList<String>();
char[] chars = str.toCharArray();
List<Character> datas = new ArrayList<Character>();
for(char c : chars){
datas.add(c);
}
for (int i = 1; i <= str.length(); i++) {
sort(datas, new ArrayList<Character>(), i, arrayList);
}
System.out.println("该字符串的全字符组合:");
int length = 1;
for (String s : arrayList) {
if (s.length() > length) {
System.out.println();
length++;
}
System.out.print(s + "\t");
}
}
private static void sort(List<Character> datas, List<Character> target,
int num, ArrayList<String> arrayList) {
if (target.size() == num) {
char[] tmpCs = new char[num];
int i = 0;
for (Character c : target) {
tmpCs[i++] = c;
}
arrayList.add(new String(tmpCs));
return;
}
for (int i = 0; i < datas.size(); i++) {
List newDatas = new ArrayList(datas);
List newTarget = new ArrayList(target);
newTarget.add(newDatas.remove(i));
sort(newDatas, newTarget, num, arrayList);
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2