算法题:100分,给出任意长度数字字符串,求所有不重复的组合
比如输入字符串 "1234 ", 输出所有的不重复的24个组合:1234,1243,1324,1342。。。。。。,
输入字符串 "123 ", 输出所有的不重复的9个组合:123,132,213,。。。。。。
提示:
第一步:求出给定字符串的所有不重复组合数,比如 "1234 "的组合是24个, "123 "是9个, "1233 "是9个,
第二步:用到Hashtable和collections.shuffle()
如果不用上面的提示用其它的方法也行
------解决方案--------------------.
------解决方案--------------------无语。。。
------解决方案--------------------要是你做得出我给你200分 你还真是个...!
------解决方案--------------------会c的,java的没写过,凑合着看吧
递归版本
#include "stdio.h "
void Swap(int &a,int &b)
{
int temp=a;a=b;b=temp;
}
void Perm(int list[],int k,int m)
{
if(k==m)
{
for(int i=0;i <=m;i++)
printf( "%d ",list[i]);
printf( "\n ");
}
else
for(int i=k;i <=m;i++)
{
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
main()
{
int a[10]={1,2,3,4,5};
Perm(a,0,4);
while(true);
}
------解决方案--------------------非递归版本: 自己改成java的吧。
#include <stdio.h>
int pl(int n)
{ int a[100];
int flag=1;
FILE *rf ;
int i,j,k,x,count=0;
rf = fopen( "pl.txt ", "w ") ;
for (i=1;i <=n;i++)
a[i]=i;
while (flag) /* 还剩余未输出的排列*/
{ for (i=1;i <=n;i++) /* 输出当前排列 */
{ printf( "%4d ",a[i]); fprintf(rf, "%4d ",a[i]);}
printf( "\n "); fprintf(rf, "\n ");
count++; /*计数器加1*/
i=n; /*从后向前找相邻位置后大前小的元素值*/
while (i> 1 && a[i] <a[i-1]) i--;
if (i==1) flag=0; /*未找到则结束*/
else {j=i-1;i=n; /* 若找到,则在该位置的后面从右向左找第一个比该元素大的值*/
while (i> j && a[i] <a[j]) i--;
k=a[j]; /*交换两元素的值*/
a[j]=a[i];
a[i]=k;
k=j+1; /*对交换后后面的数据由小到大排序*/
for ( i=k+1;i <=n;i++) /*插入排序*/
{ j=i-1;
x=a[i];
while (j> =k && x <a[j]) { a[j+1]=a[j]; j--;}
a[j+1]=x;
}
}
}
fclose(rf);
return count; /*返回排列总个数*/
}
int main()
{int n,m=0;
printf( "please input n: ");
scanf( "%d ",&n);
m=pl(n);
printf( "\nm=%d ",m);
getch();
}
------解决方案--------------------123不重复还能搞出9个来?
------解决方案--------------------public class PaiLie {
public static void main(String[] args) {
int []a= new int[]{1,2,3,4,5};
Perm(a,0,4);
}
public static void Perm(int list[],int k,int m){
if(k==m){
for(int i=0;i <=m;i++)
System.out.print(list[i]);
System.out.println();