帮帮忙写个算法

该用户的昵称呢 2013-12-02 07:41:16
就是有一个字符串 String s="DXDXDXDXDX" 我需要把他们各种会出现的情况显示出来
如 DDDDDDDDDD,XXXXXXXXXX,DDDDDXXXXX。。。。等等
我估计会有1024种情况。。不知道对不对
现在是一点思路都没有啊,这个不像是阶层那样求解。。。
...全文
589 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
msj100ff 2013-12-28
  • 打赏
  • 举报
回复
引用 18 楼 suntao303 的回复:
[quote=引用 17 楼 msj100ff 的回复:] [quote=引用 10 楼 suntao303 的回复:] [quote=引用 9 楼 msj100ff 的回复:] [quote=引用 8 楼 msj100ff 的回复:] 这是个简单的组合,可以看成是10个格子,然后向这个10个格子里插5个D,剩下的格子不用管,肯定都是X,组合公式打不出来,简化后 10!/(5!*(10-5)!) 组合化简公式: n!/(r!*(n-r)!)
还有说明的就是 字符串 s="DXDXDXDXDX" 已经确定了组合出的字符串必须是包含了5个D和5个X,所以不会出现LZ说的 DDDDDDDDDD XXXXXXXXXX DDXXXXXXXX等等。[/quote]事实上出现了这些情况。。。二楼都说的很清楚了,我已经实现出来了[/quote] 嗯 一共是252种[/quote] 为什么不会出现0000000001这种情况? [/quote]
引用 18 楼 suntao303 的回复:
[quote=引用 17 楼 msj100ff 的回复:] [quote=引用 10 楼 suntao303 的回复:] [quote=引用 9 楼 msj100ff 的回复:] [quote=引用 8 楼 msj100ff 的回复:] 这是个简单的组合,可以看成是10个格子,然后向这个10个格子里插5个D,剩下的格子不用管,肯定都是X,组合公式打不出来,简化后 10!/(5!*(10-5)!) 组合化简公式: n!/(r!*(n-r)!)
还有说明的就是 字符串 s="DXDXDXDXDX" 已经确定了组合出的字符串必须是包含了5个D和5个X,所以不会出现LZ说的 DDDDDDDDDD XXXXXXXXXX DDXXXXXXXX等等。[/quote]事实上出现了这些情况。。。二楼都说的很清楚了,我已经实现出来了[/quote] 嗯 一共是252种[/quote] 为什么不会出现0000000001这种情况? [/quote] 不是你写的 字符串 String s="DXDXDXDXDX" 那不就是说这个字符串包含了5个D和5个X 怎么会出现 000000001这种情况 按题意 必然是5个0和5个1
  • 打赏
  • 举报
回复
是我出的题有问题。。。 s 指定了一个值了。。。其实是想就两个String 转成 10个字段长度的String的可能性。。。。
王晓斌 2013-12-27
  • 打赏
  • 举报
回复
题目desc有点歧义
王晓斌 2013-12-27
  • 打赏
  • 举报
回复
C(1, n) + ... + C(n, n);全组合啊
msj100ff 2013-12-26
  • 打赏
  • 举报
回复
引用 10 楼 suntao303 的回复:
[quote=引用 9 楼 msj100ff 的回复:] [quote=引用 8 楼 msj100ff 的回复:] 这是个简单的组合,可以看成是10个格子,然后向这个10个格子里插5个D,剩下的格子不用管,肯定都是X,组合公式打不出来,简化后 10!/(5!*(10-5)!) 组合化简公式: n!/(r!*(n-r)!)
还有说明的就是 字符串 s="DXDXDXDXDX" 已经确定了组合出的字符串必须是包含了5个D和5个X,所以不会出现LZ说的 DDDDDDDDDD XXXXXXXXXX DDXXXXXXXX等等。[/quote]事实上出现了这些情况。。。二楼都说的很清楚了,我已经实现出来了[/quote] 嗯 一共是252种
  • 打赏
  • 举报
回复
引用 17 楼 msj100ff 的回复:
[quote=引用 10 楼 suntao303 的回复:] [quote=引用 9 楼 msj100ff 的回复:] [quote=引用 8 楼 msj100ff 的回复:] 这是个简单的组合,可以看成是10个格子,然后向这个10个格子里插5个D,剩下的格子不用管,肯定都是X,组合公式打不出来,简化后 10!/(5!*(10-5)!) 组合化简公式: n!/(r!*(n-r)!)
还有说明的就是 字符串 s="DXDXDXDXDX" 已经确定了组合出的字符串必须是包含了5个D和5个X,所以不会出现LZ说的 DDDDDDDDDD XXXXXXXXXX DDXXXXXXXX等等。[/quote]事实上出现了这些情况。。。二楼都说的很清楚了,我已经实现出来了[/quote] 嗯 一共是252种[/quote] 为什么不会出现0000000001这种情况?
  • 打赏
  • 举报
回复
i小于改成1024就行写成MAXVALUE了 不好意思
  • 打赏
  • 举报
回复
再补充下:比如是1(二进制是0000000001假设把D看做1)那么
String str="XXXXXXXXXD"
//以此类推 是2(二进制0000000010)的情况
String str ="XXXXXXXXDX"
//推理完成代码如下
String str="";
		for (int i = 0; i < Integer.MAX_VALUE; i++) {
			str = Integer.valueOf(i).toBinaryString(i);
			if (str.length() != 10) {
                            //这里用了一个apache的包commons-lang-2.5.jar 包含StringUtils
				str = StringUtils.leftPad(str, 10, "0");
			}
			str = str.replaceAll("0", "X");
			str = str.replaceAll("1", "D");
			System.out.println(str);
		}
同理
Mourinho 2013-12-24
  • 打赏
  • 举报
回复
1024种的递归解法

public class Test001 {

	static int _count = 0;
	
	public static void main(String[] args) {
		final char[] ARR = new char[] { 'D', 'X' };
		output(ARR, 10, "");
		System.out.println("count:" + _count);
	}

	static void output(char[] arr, int n, String str) {
		if (n == 0) {
			System.out.println(str);
			++_count;
			return;
		}
		for (char c : arr) {
			output(arr, n - 1, str + c);
		}
	}
}
  • 打赏
  • 举报
回复
就是1024中情况!你把D看做0或者1 X看做1或者0这样就是1024了情况就很简单
Mourinho 2013-12-24
  • 打赏
  • 举报
回复
之前有写过全排列的算法 加上了去重 注意:根据我的理解,字符'D','X'每个只会出现5次,而不是10次。 结果有A(10,5)=10!/5!=252种

import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.LinkedList;

public class Test001 {

	public static void main(String[] args) {
		final String STR = "DXDXDXDXDX";
		Collection<String> collection = getAllPermutation(STR, STR.length(), true);
		for (String string : collection) {
			System.out.println(string);
		}
		System.out.println("count:" + collection.size());
	}
	
	/**
	 * 返回该字符串字符的排列组合
	 * 
	 * @param source
	 *            字符串
	 * @param count
	 *            取出排列字符的个数
	 * @param isUnique
	 *            是否需要去重,需要去重设置true
	 * @return 该字符串所有字符的排列组合,无法获取返回null
	 */
	public static Collection<String> getAllPermutation(String source,
			int count, boolean isUnique) {
		if (source == null || source.equals("")) {
			return null;
		}
		Collection<String> collection = isUnique ? new LinkedHashSet<String>()
				: new LinkedList<String>();
		getAllPermutation(source.toCharArray(), count, 0, collection);
		return collection;
	}

	/**
	 * 返回字符数组的排列组合
	 */
	static void getAllPermutation(char[] arr, int count, int index,
			Collection<String> collection) {
		if (index == count) {
			collection.add(String.valueOf(Arrays.copyOfRange(arr,
					index - count, index)));
			return;
		}
		for (int i = index; i < arr.length; i++) {
			swap(arr, i, index);
			getAllPermutation(arr, count, index + 1, collection);
			swap(arr, i, index);
		}
	}

	/**
	 * 返回字符数组的组合
	 */
	static void getCombination(char[] arr, int count, int begin, int index,
			char[] tempArr, Collection<String> collection) {
		if (index == count) {
			collection.add(String.valueOf(tempArr));
			return;
		}
		for (int i = begin; i < arr.length; i++) {
			tempArr[index] = arr[i];
			getCombination(arr, count, i + 1, index + 1, tempArr, collection);
		}
	}

	static void swap(char array[], int i, int j) {
		char tmp = array[i];
		array[i] = array[j];
		array[j] = tmp;
	}
}
songtaixin 2013-12-24
  • 打赏
  • 举报
回复
List<String>strList=new ArrayList<String>();	 
  StringBuilder sb=new StringBuilder();
  String str;
  char[]chs={'D','X'};
  Random r=new Random();
  
  while(true)
  {
	  for(int j=0;j<10;j++)
	  {
		 sb.append(chs[r.nextInt(2)]); 
	  }
	  str=sb.toString();
	  sb.delete(0, sb.length());
	  if(strList.contains(str))
		  continue;
	  else strList.add(str);
	  if(strList.size()==1024)//能计算出所有可能情况的个数
		  break; 
  }
  for(int i=0;i<strList.size();i++)
	  System.out.println(strList.get(i));
 System.out.println("总共:"+strList.size());
//新手,自己写了一个,能够按照要求输出显示所有可能组合,求点评!!
  • 打赏
  • 举报
回复
引用 9 楼 msj100ff 的回复:
[quote=引用 8 楼 msj100ff 的回复:] 这是个简单的组合,可以看成是10个格子,然后向这个10个格子里插5个D,剩下的格子不用管,肯定都是X,组合公式打不出来,简化后 10!/(5!*(10-5)!) 组合化简公式: n!/(r!*(n-r)!)
还有说明的就是 字符串 s="DXDXDXDXDX" 已经确定了组合出的字符串必须是包含了5个D和5个X,所以不会出现LZ说的 DDDDDDDDDD XXXXXXXXXX DDXXXXXXXX等等。[/quote]事实上出现了这些情况。。。二楼都说的很清楚了,我已经实现出来了
msj100ff 2013-12-03
  • 打赏
  • 举报
回复
引用 8 楼 msj100ff 的回复:
这是个简单的组合,可以看成是10个格子,然后向这个10个格子里插5个D,剩下的格子不用管,肯定都是X,组合公式打不出来,简化后 10!/(5!*(10-5)!) 组合化简公式: n!/(r!*(n-r)!)
还有说明的就是 字符串 s="DXDXDXDXDX" 已经确定了组合出的字符串必须是包含了5个D和5个X,所以不会出现LZ说的 DDDDDDDDDD XXXXXXXXXX DDXXXXXXXX等等。
msj100ff 2013-12-03
  • 打赏
  • 举报
回复
这是个简单的组合,可以看成是10个格子,然后向这个10个格子里插5个D,剩下的格子不用管,肯定都是X,组合公式打不出来,简化后 10!/(5!*(10-5)!) 组合化简公式: n!/(r!*(n-r)!)
flehss 2013-12-03
  • 打赏
  • 举报
回复
恩恩,原理大概懂了
奥西里斯 2013-12-03
  • 打赏
  • 举报
回复
顶楼上,学习了
WayneXuan 2013-12-02
  • 打赏
  • 举报
回复
从Integer类的toUnsignedString方法改的
WayneXuan 2013-12-02
  • 打赏
  • 举报
回复

class Test {
	static char[] digits=new char[]{'X','D'};
	public static void main(String[] args) {
		for (int i=0; i<1024; i++) {
			System.out.println(toUnsignedString(i));
		}
	}
	private static String toUnsignedString(int i) {
		char[] buf=new char[10];
		int charPos=10;
		for (int j=0; j<10; j++) {
			buf[--charPos]=digits[i&1];
			i>>>=1;
		}
		return new String(buf);
	}
}
  • 打赏
  • 举报
回复
 for (int i = 1024; i < 2048; i++) {
        	String binStr = Integer.toBinaryString(i);
        	System.out.println(binStr);
			
		}
这样就可以了把
加载更多回复(2)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧