Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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的最小二进制数_Java - Fatal编程技术网

Java 求不带连续1的最小二进制数

Java 求不带连续1的最小二进制数,java,Java,事情是这样的。 我必须编写代码来显示二进制数X的下一个最小的“code-X数”,它比二进制数X大。 code-X数字是一个没有连续1的二进制数字。例如:1100不是代码X号,因为它有11,而1001是代码X号 这是我的密码 String a = "11001110101010"; String b = ""; int d = 0; for(int i = a.length()-1; i>0;i--){ if(a

事情是这样的。 我必须编写代码来显示二进制数X的下一个最小的“code-X数”,它比二进制数X大。 code-X数字是一个没有连续1的二进制数字。例如:1100不是代码X号,因为它有11,而1001是代码X号 这是我的密码

String a = "11001110101010";
    String b = "";
    int d = 0;
    for(int i = a.length()-1; i>0;i--){
        if(a.charAt(i) == '1' && a.charAt(i-1)=='1'){
        while(a.charAt(i)=='1'){
            b = b + '0';
            if(i!=0){i--;}
            d++;
        }
        }
        b = b + a.charAt(i);
    }
    StringBuffer c = new StringBuffer(b);
    System.out.println(c.reverse());
我计划将二进制字符串复制到字符串b,将下一个I为“1”的每个“1”替换为“0”,并插入一个“1” 比如: 1100 ---> 10000 但我不知道怎么做:)
你能帮我一些忙吗?谢谢,试试这个。这将处理任意长度的位字符串。算法如下

  • 需要有条件地修改最后两位,以便在数字不是codeEx数字时强制更改。这确保了它会更高。感谢你的观察
  • 从左侧开始,找到第一组1。e、 g 0110
  • 如果不是一开始就用100替换它,得到1000
  • 否则,请在开头插入1
  • 在所有情况下,将分组右侧的所有内容都替换为0
印刷品

10000101000000000001000001000000001111000000000000110000000000011011
10000101000000000001000001000000010000000000000000000000000000000000


使用原始二进制文件,您可以使用以下命令

public static void main(String[] args) {
    long l = 0b1000010100000000010000010000000011110000000000110000000000011011L;
    System.out.println(
            Long.toBinaryString(nextX(l)));
}

public static long nextX(long l) {
    long l2 = l >>> 1;
    long next = Long.highestOneBit(l & l2);
    long cutoff = next << 1;
    long mask = ~(cutoff - 1);
    return (l & mask) | cutoff;
}

编辑:基于@WJS找到最小值的正确方法。这是WJS 99%正确答案的轻微扩展

只缺少一件事,如果原始X字符串中没有连续的1,则该数字不会增加。 对main方法的此修改将处理该问题

编辑;添加了一个else{}。从字符串的末尾开始,所有数字都应反转,直到找到0为止。然后在将结果字符串传递给WJS的codeX函数之前,我们将其更改为1和break。 (法典版本不包括sb.替换(len-2,len,“11”);)


只是一个粗略的想法-如果你把0放在11之间呢?举个例子,答案不仅仅是
1000000000000
@Mike'Pomax'Kamermans,我意识到我一开始对这个问题不是很理解。所以,正如你所说,我的帖子不属于答案。为此,我将其删除。祝你好运:)这不是“一个二进制数X的下一个最小的”code-X number“它比二进制数X大”不太容易理解,如果你有二进制数X,这篇文章是关于找到比X高的“下一个数”,并且在它的位模式中没有连续的数抱歉,没有看到代码编辑。这确实有效,但效率太低,根本不应该算作一个好答案;)当然是一个答案!替换为更有效的方法。此更新(截至8月11日,19:53Z)在我检查的所有情况下都有效。此解决方案打印“100000101010”,十进制为17450。但“1000000000000”是最小的可能性,十进制值为16384。具体来说,任何以
11…
开头的数字都有
10…0
作为其解,所以
0b11011l
所以处理b11的时间与
b11
一样长:这应该是一个快速检查和更换。反向运行:从MSB而不是LSB开始,旋转直到达到1,然后检查下一个值是否也是1。如果是这样:我们完成了,答案是
位位置OP要求的是“下一个最小值”,不是最大值,而是小于解决方案。如果您只是将最后两位替换为
11
,会怎么样。它们要么会被高阶分组消除,要么会自行改变。实际上,它不适用于1001,因为输出应该是1010。但是我得到了10000好吧,我编辑了这篇文章来处理1001案件。这应该是完整的解决方案
public static void main(String[] args) {
    long l = 0b1000010100000000010000010000000011110000000000110000000000011011L;
    System.out.println(
            Long.toBinaryString(nextX(l)));
}

public static long nextX(long l) {
    long l2 = l >>> 1;
    long next = Long.highestOneBit(l & l2);
    long cutoff = next << 1;
    long mask = ~(cutoff - 1);
    return (l & mask) | cutoff;
}
1000010100000000010000010000000010000000000000000000000000000000
public static void main(String[] args) {
    String x = "10100";
    StringBuilder sb = new StringBuilder(x);

    if (!x.contains("11")) {
        for (int i = sb.length()-1; i >= 0; i--) {
            if (sb.charAt(i) == '0') {
                sb.setCharAt(i, '1');
                break;
            } else {
                sb.setCharAt(i, '0');
            }
        }
    }

    String result = codeX(sb.toString());

    System.out.println(x);
    System.out.println(result);
}