今天到去面试,问到一个发牌程序到算法问题(54张牌不分花色发给ABC三个人).寡人给出到算法实现代码如下算法1:不洗牌,顺序发牌,但是每张牌发给A,B,C是随机的
package com;import java.util.ArrayList;
import java.util.List;public class Test1 { /**
 * @param args
 */
static List a = new ArrayList<Integer>();
static List b = new ArrayList<Integer>();
static List c = new ArrayList<Integer>(); public static void main(String[] args) {
// TODO Auto-generated method stub for (int i = 1; i <= 54; i++) {
            fill(i);
}
System.out.println(a);
System.out.println(b);
System.out.println(c);
} private static void fill(int i) {
int r = (int) (java.lang.Math.random() * 3) + 1;
//System.out.println(r);
if (r == 1 && a.size() < 18) {
a.add(i);
return;
} if (r == 1 && a.size() >= 18) {
fill(i);
return;
}
if (r == 2 && b.size() < 18) {
b.add(i);
return;
}
if (r == 2 && b.size() >= 18) {
fill(i);
return;
}
if (r == 3 && c.size() < 18) {
c.add(i);
return;
}
if (r == 3 && c.size() >= 18) {
fill(i);
return;
}
}}
算法2:考官给出到算法
用list顺序保存1-54个数,每次随机找出一个发给ABC,并将list里已发到remove点,继续发下一张牌代码如下package com;import java.util.ArrayList;
import java.util.List;public class Test2 { /**
 * @param args
 */
static List a = new ArrayList<Integer>();
static List b = new ArrayList<Integer>();
static List c = new ArrayList<Integer>(); public static void main(String[] args) {
// TODO Auto-generated method stub
List list = new ArrayList<Integer>(); for (int i = 1; i <= 54; i++) {
list.add(i);
}
while(list.size()>0){
int size=list.size();
int r=(int) (java.lang.Math.random() * size);
if(a.size()<18){
a.add(list.get(r));
list.remove(r);
continue;
}
if(b.size()<18){
b.add(list.get(r));
list.remove(r);
continue;
}
if(c.size()<18){
c.add(list.get(r));
list.remove(r);
continue;
}
}
System.out.println(a);
System.out.println(b);
System.out.println(c);
}}
算法三:我后来查JDK想出来到
用list顺序保存1-54个数,再用java.util.Collections.shuffle方法把list的元素随机排列,代码最少
ackage com;import java.util.ArrayList;
import java.util.List;
public class Test { /**
 * @param args
 */
static List a = new ArrayList<Integer>();
static List b = new ArrayList<Integer>();
static List c = new ArrayList<Integer>();
public static void main(String[] args) {
// TODO Auto-generated method stub
List list=new ArrayList<Integer>();

for(int i=1;i<=54;i++){
list.add(i);
}
java.util.Collections.shuffle(list);
a=list.subList(0, 18);
System.out.println(a);
b=list.subList(18, 36);
System.out.println(b);
c=list.subList(36, 54);
System.out.println(c);
}}
请各位看管点评下几种算法到问题和效率,并补充好到算法大家交流下

解决方案 »

  1.   

    public static void main(String[] args) {
    List list1=new ArrayList();
    List list2=new ArrayList();

    for(int i=0;i<9;i++){
    list1.add(i);
    }

    for(int i=0;i<10;i++){
    list2.add(i);
    } for(int i=0;i<10;i++){
    if(!list1.remove(new Integer((Integer) list2.get(i)))){
    System.out.println(list2.get(i));
    break;
    }
    }
    }
      

  2.   

    感谢LS捧场哈,你提供了一个算法,但是你的算法还是可以改进的,建议用list2.removeAll(list1),list2剩下的就是没有加入的不过还有更好的算法