Chinaunix首页 | 论坛 | 博客
  • 博客访问: 867635
  • 博文数量: 215
  • 博客积分: 10062
  • 博客等级: 上将
  • 技术积分: 2235
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-01 13:21
文章分类

全部博文(215)

文章存档

2012年(1)

2011年(24)

2009年(16)

2008年(91)

2007年(83)

我的朋友

分类: Java

2011-02-12 16:03:38

文件: Copy_2_of_StatisAnyThree.zip
大小: 1KB
下载: 下载

import java.util.ArrayList;
import java.util.List;

/**
 * 统计任三出现的最多的几率的组合 10. * 11. *
 *
 * @author zhangjie
 * @date 2010-1-1下午01:22:19 13.
 */
public class Copy_2_of_StatisAnyThree {
 // 组合算法 16.// 本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标 17.// 代表的数被选中,为0则没选中。
 // 18.// 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。 19.//
 // 然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为 20.//
 // “01”组合,同时将其左边的所有“1”全部移动到数组的最左端。 21.//
 // 当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得 22.// 到了最后一个组合。 23.// 例如求5中选3的组合:
 // 24.// 1 1 1 0 0 //1,2,3 25.// 1 1 0 1 0 //1,2,4 26.// 1 0 1 1 0 //1,3,4
 // 27.// 0 1 1 1 0 //2,3,4 28.// 1 1 0 0 1 //1,2,5 29.// 1 0 1 0 1 //1,3,5
 // 30.// 0 1 1 0 1 //2,3,5 31.// 1 0 0 1 1 //1,4,5 32.// 0 1 0 1 1 //2,4,5
 // 33.// 0 0 1 1 1 //3,4,5 34.
 public static void main(String[] args) {
  Copy_2_of_StatisAnyThree s = new Copy_2_of_StatisAnyThree();
  s.printAnyThree();
 }

 /**
  * 40. * 41.
  */
 public void printAnyThree() {
  int[] num = new int[] { 1, 2, 3, 4, 5, 6 };
  print(combine(num, 3));
 }

 /**
  * 48. * 从n个数字中选择m个数字 49. *
  *
  * @param a
  *            50. *
  * @param m
  *            51. *
  * @return 52.
  */
 public List combine(int[] a, int m) {
  int n = a.length;
  // if(m>n){
  // throw new Exception("错误!数组a中只有"+n+"个元素。"+m+"大于"+2+"!!!");
  // }
  List result = new ArrayList();

  int[] bs = new int[n];
  for (int i = 0; i < n; i++) {
   bs[i] = 0;
  }
  // 初始化 66.
  for (int i = 0; i < m; i++) {
   bs[i] = 1;
  }
  boolean flag = true;
  boolean tempFlag = false;
  int pos = 0;
  int sum = 0;
  // 首先找到第一个10组合,然后变成01,同时将左边所有的1移动到数组的最左边 74.
  do {
   sum = 0;
   pos = 0;
   tempFlag = true;
   result.add(print(bs, a, m));

   for (int i = 0; i < n - 1; i++) {
    if (bs[i] == 1 && bs[i + 1] == 0) {
     bs[i] = 0;
     bs[i + 1] = 1;
     pos = i;
     break;
    }
   }
   // 将左边的1全部移动到数组的最左边 89.
   for (int i = 0; i < pos; i++) {
    if (bs[i] == 1) {
     sum++;
    }
   }
   for (int i = 0; i < pos; i++) {
    if (i < sum) {
     bs[i] = 1;
    } else {
     bs[i] = 0;
    }
   }

   // 检查是否所有的1都移动到了最右边
   for (int i = n - m; i < n; i++) {
    if (bs[i] == 0) {
     tempFlag = false;
     break;
    }
   }
   if (tempFlag == false) {
    flag = true;
   } else {
    flag = false;
   }

  } while (flag);
  result.add(print(bs, a, m));
  return result;
 }

 private int[] print(int[] bs, int[] a, int m) {
  int[] result = new int[m];
  int pos = 0;
  for (int i = 0; i < bs.length; i++) {
   if (bs[i] == 1) {
    result[pos] = a[i];
    pos++;
   }
  }
  return result;
 }

 private void print(List l) {
  for (int i = 0; i < l.size(); i++) {
   int[] a = (int[]) l.get(i);
   for (int j = 0; j < a.length; j++) {
    System.out.print(a[j] + "\t");
   }
   System.out.println();
  }
 }
}

阅读(465) | 评论(0) | 转发(0) |
0

上一篇:Handler的使用<二>

下一篇:判断身份证

给主人留下些什么吧!~~