您的位置:首页 > 职场人生

面试算法题:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

2016-11-16 20:18 489 查看

题目

有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

这个题目还是网上找的。

思路

这个没什么好思路目前。想到的最通用的办法就是:先找出四个数字的其中三个,然后分别把这三个数字可以排布的顺序打印出来。

三个数字进行排布,C++会用链表,每次遍历一次链表输出一次,然后头结点断开,第二个节点成为新的头结点,然后尾节点指向原来的头结点。java里不知道用什么好,这里就用数组进行位移了,感觉特别不好,请知道的指点一下。

这个思路其实并不太好,有更好的方式请告知一下,谢谢。

至于个数是A(4,3)=4*3*2=24;

代码

public static void main(String[]args){
int a[]={1,2,3,4};
int N=a.length;
int[][] b=new int[a.length][a.length-1];
fun1234();
select3of4(a,b);
makeNum(b[3]);
for (int i = 0; i < N; i++) {
makeNum(b[i]);
}

}
//4个数字中找出3个数字,这个算法应该有很多,存储方式也很多。
private static void select3of4(int a[],int[][] b) {
int N=a.length;
int m,n;
for (int i = 0; i < N; i++) {
m=0;
n=0;
while(m<N){
if(m!=i){
b[i]
=a[m];
n++;
}
m++;

}
}

}
//每次顺序移动一次数组,然后输出。这样可以保证不重复
private static void makeNum(int a[]) {
int N=a.length;
for (int k = 0; k < N; k++) {
for (int i = 0; i < N; i++) {
System.out.print(a[i]);
}
System.out.println();
for (int i = 0; i < N; i++) {
System.out.print(a[N-i-1]);
}
System.out.println();
flow(a);
}
}
//顺序移位
private static void flow(int a[]){
int tmp=a[0];
for (int i = 0; i < a.length-1; i++) {
a[i]=a[i+1];
}
a[a.length-1]=tmp;
}


上面的代码其实效率比直接算没太大优势,只是通用性强一些。比如数组改成了{a,c,e,f}这样的也能计算。

直接算的代码如下:

private static void fun1234() {
// TODO Auto-generated method stub
int count = 0;
for (int x = 1; x < 5; x++) {
for (int y = 1; y < 5; y++) {
for (int z = 1; z < 5; z++) {
if (x != y && y != z && x != z) {
count++;
System.out.println(x * 100 + y * 10 + z + "   ");
}
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 算法 1234 三位数
相关文章推荐