Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 1和0的置换_Java_Algorithm - Fatal编程技术网

Java 1和0的置换

Java 1和0的置换,java,algorithm,Java,Algorithm,我需要一种有效的方法,在指定字符串长度的字符串中排列给定数量的1和0。例如,如果有一个长度为6个数字的字符串,而其中只有一个1,则该字符串的所有排列将为: 000001 000010 000100 001000 010000 十万 我所需要的方法的主要问题是它不应该运行到6!彼此相同的不同排列。换句话说,它不应该将不可区分的零相互置换,而只置换可区分的字符。 有没有用Java实现这一点的方法? 提前感谢您:有几种方法可以解决这个问题 使用位移位运算符。从一个000001开始,做你需要做的事情。然

我需要一种有效的方法,在指定字符串长度的字符串中排列给定数量的1和0。例如,如果有一个长度为6个数字的字符串,而其中只有一个1,则该字符串的所有排列将为:

000001 000010 000100 001000 010000 十万

我所需要的方法的主要问题是它不应该运行到6!彼此相同的不同排列。换句话说,它不应该将不可区分的零相互置换,而只置换可区分的字符。 有没有用Java实现这一点的方法?
提前感谢您:

有几种方法可以解决这个问题


使用位移位运算符。从一个000001开始,做你需要做的事情。然后一点点向左移动我突然想到了几个方法

方法1。使用中的方法生成字符串的所有排列。把它们都放到一个集合中,瞧,你消除了重复的部分

方法2。数一数。然后通过在所有位置组合上分布排列来生成所有排列。请注意,1的初始位置与结果无关。递归方法可能是这样的:

public List<String> generatePermutations(int numOnes, int stringLength) {
    final StringBuilder sb = new StringBuilder();
    final List<String> result = new ArrayList<>();
    distributeOnes(numOnes, stringLength, sb, result);
    return result;
}

private void distributeOnes(int numOfOnesRemaining, int positionsToFill, StringBuilder sb,
    List<String> result)
{
    if (numOfOnesRemaining == 0) {
        while (positionsToFill-- > 0) {
            sb.append('0');
        }
        result.add(sb.toString());
        return;
    }
    final int lastPos = positionsToFill - numOfOnesRemaining;
    final int sbLength = sb.length();
    for (int i = 0; i <= lastPos; ++i) {
        // put i zeros
        for (int j = 0; j < i; ++j) {
            sb.append('0');
        }
        // put in the next one
        sb.append('1');
        // recurse with one less one and i+1 fewer positions to fill
        distributeOnes(numOfOnesRemaining - 1, positionsToFill - i - 1, sb, result);
        // undo the changes that we made to sb
        sb.setLength(sbLength);
    }
}

distributeOnes方法可以稍加改进。没有必要每次通过循环都附加i零;我们应该能够重新组织代码,每次只追加一个零。然而,这将涉及不同的簿记,包括重置sb长度的不同逻辑,我太懒了,无法计算出来:-

是的,有一种在Java中实现的方法。并且@Robby已经回答了。来到这里期待@RobbyCornelissen的回答。。答案可能包括确定数字1到32的所有二进制表示,然后过滤掉与所需数字1不匹配的二进制值。这是一个冗长的回答,你没有向我们展示任何努力。一般来说,你应该做研究,然后在这里问一个具体的问题。如果你想知道有多少种方法可以将n1与m0置换,这与将n个相同的对象放置在n+m个孔中是一样的。你需要搜索一些算法。是的,但这只适用于只有一个1的情况。问题是:排列给定数量的1和0。这不会生成所有排列;只有循环置换。你可以使用两个循环x和y和x=y表示2个1,等等。我添加了一个纯基于字符串的递归方法。
100000
010000
001000
000100
000010
000001
110000
101000
100100
100010
100001
011000
010100
010010
010001
001100
001010
001001
000110
000101
000011
111100
111010
111001
110110
110101
110011
101110
101101
101011
100111
011110
011101
011011
010111
001111
public List<String> generatePermutations(int numOnes, int stringLength) {
    final StringBuilder sb = new StringBuilder();
    final List<String> result = new ArrayList<>();
    distributeOnes(numOnes, stringLength, sb, result);
    return result;
}

private void distributeOnes(int numOfOnesRemaining, int positionsToFill, StringBuilder sb,
    List<String> result)
{
    if (numOfOnesRemaining == 0) {
        while (positionsToFill-- > 0) {
            sb.append('0');
        }
        result.add(sb.toString());
        return;
    }
    final int lastPos = positionsToFill - numOfOnesRemaining;
    final int sbLength = sb.length();
    for (int i = 0; i <= lastPos; ++i) {
        // put i zeros
        for (int j = 0; j < i; ++j) {
            sb.append('0');
        }
        // put in the next one
        sb.append('1');
        // recurse with one less one and i+1 fewer positions to fill
        distributeOnes(numOfOnesRemaining - 1, positionsToFill - i - 1, sb, result);
        // undo the changes that we made to sb
        sb.setLength(sbLength);
    }
}