Java实现通用组合算法

来源:java认证发布时间:2012-11-12 13:12:40java认证视频

  /**

  * 对一个指定的N场比赛的长度为N的单式投注字符串进行组合

  * 输入单式投注注字符串string,例如31311133,组合得到类似******33,*****1*3,... ...结果的集合

  *

  * @author 时延军

  *

  */

  class SplitterThread implements Runnable {

  private char[] charArray;

  private int len; // 数字字符的个数

  List occupyIndexList = new ArrayList(); // 统计字符串中没有带*的位置的索引

  private List container = new ArrayList();

  private BitSet startBitSet; // 比特集合起始状态

  private BitSet endBitSet; // 比特集合终止状态,用来控制循环

  public SplitterThread(String string) {

  this.charArray = string.toCharArray();

  this.len = string.replace("*", "").length();

  this.startBitSet = new BitSet(len);

  this.endBitSet = new BitSet(len);

  // 初始化startBitSet,左侧占满*符号

  int count = 0; //

  for (int i=0; i

  if(charArray[i] != '*') {

  if(count < starCount) {

  this.startBitSet.set(i, true);

  count++;

  }

  occupyIndexList.add(i);

  }

  }

  // 初始化endBit,右侧占满*符号

  count =0;

  for (int i = string.length()-1; i > 0; i--) {

  if(charArray[i] != '*') {

  if(count < starCount) {

  this.endBitSet.set(i, true);

  count++;

  }

  occupyIndexList.add(i);

  }

  }

  // 根据起始startBitSet,构造带*的组合字符串并加入容器

  char[] charArrayClone = this.charArray.clone();

  for (int i=0; i

  if (this.startBitSet.get(i)) {

  charArrayClone[i] = '*';

  }

  }

  this.container.add(new String(charArrayClone));

  }

  public void run() {

  this.split();

  synchronized(filteredContainer) {

  filteredContainer.addAll(this.container);

  }

  }

  public void split() {

  while(!this.startBitSet.equals(this.endBitSet)) {

  int zeroCount = 0; // 统计遇到10后,左边0的个数

  int oneCount = 0; // 统计遇到10后,左边1的个数

  int pos = 0; // 记录当前遇到10的索引位置

  char[] charArrayClone = this.charArray.clone();

  // 遍历startBitSet来确定10出现的位置

  for (int i=0; i

  if (!this.startBitSet.get(this.occupyIndexList.get(i))) {

  zeroCount++;

  }

  if (this.startBitSet.get(this.occupyIndexList.get(i))

  && !this.startBitSet.get(this.occupyIndexList.get(i+1))) {

  pos = i;

  oneCount = i - zeroCount;

  // 将10变为01

  this.startBitSet.set(this.occupyIndexList.get(i), false);

  this.startBitSet.set(this.occupyIndexList.get(i+1), true);

  break;

  }

  }

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答