【问题标题】:List of all binary combinations for a number in JavaJava中数字的所有二进制组合列表
【发布时间】:2011-09-21 17:53:25
【问题描述】:

我正在从事一个涉及“动态编程”的项目,并且对这个微不足道的事情感到震惊,请帮忙。

假设我将 4 作为输入,我想显示如下内容:0000 到 1111

但是,如果我输入 5,我想显示为:00000 到 11111 等等。

提前致谢,

编辑:请不要发帖问我要代码。这不是作业问题,我不需要任何代码,只需告诉我它的逻辑,我会很高兴。

EDIT2:Stackoverflow 正在发生 WTH,我有没有要求你们中的任何人为我编写代码?我希望投反对票的人投赞成票。如果我无法寻求帮助,这个论坛还有什么意义?

与我分享逻辑。我们可以讨论,我不需要这个代码。

EDIT3:我在这里发布我尝试过的代码。我希望这“满足”所有认为我没有尝试过任何东西的人。

import java.util.ArrayList;

公共类RegularInvestigator {

public ArrayList createCombinations(ArrayList listOfFlightNumbers) {

ArrayList<String> result = new ArrayList<String>();

for(int i = 1; i < listOfFlightNumbers.size(); i++) {

  String binaryEqvivalent = Integer.toBinaryString(i);System.out.println(binaryEqvivalent);
  String element = "";

  for(int j = 0; j < binaryEqvivalent.length(); j++)
    if(binaryEqvivalent.charAt(j) == '1')
      element += listOfFlightNumbers + " ";

  result.add(element.substring(0, element.length() - 1));
}

return result;

}

private String getContent(ArrayList<String> flight) {
String temp = "";

for(int i = 0; i < flight.size() - 1; i++)  temp += flight.get(i) + " ";

temp += flight.get(flight.size() - 1);

return temp;

}

private ArrayList removeElementAtIndex(ArrayList flight, int position) {

ArrayList<String> res = new ArrayList<String>();

for(int i = 0; i < flight.size(); i++) {
  if(i != position) res.add(flight.get(i));
}

return res;

} }

EDIT4:感谢 phoxis、PengOne、Jerry Coffin 和 oliholz 的宝贵回答:)

【问题讨论】:

  • 你需要显示0000到1111的所有组合还是只显示0000和1111
  • 分享代码并查看
  • @harigm,从 0000 到 1111 的所有组合用于输入为 4
  • 我正在处理一个涉及此逻辑的问题,因此我无法与您分享整个代码。我正在研究一个动态编程问题,它涉及列出一个字符串的所有有效组合,所以如果我知道这个问题的逻辑,我可以在我的项目中应用这个逻辑并可以看到它的性能
  • @Shankar:“如果我不能寻求帮助,这个论坛还有什么意义?”这实际上不是一个论坛,它是一个问答网站。 :)

标签: java algorithm binary combinations


【解决方案1】:
  • 获取输入n
  • i=0 计数到(2^n) - 1
  • i 的每个值位掩码i 的每个位并显示。

【讨论】:

  • 谢谢,但我需要二进制流中的位数是 n 的值
  • 按照上面的操作你会明白的。只需从 LSB 开始屏蔽并打印到 n
  • 使用&amp; 运算符? mask = 0x01 and i=the count ,并在每次迭代时向左移动掩码并执行 mask & i 如果结果为真则打印 1 否则打印 0
  • @Shankar:您是否删除了您的评论“如何在 java 中进行位掩码?”
  • 是的,我确实想通了 :)
【解决方案2】:
public void outBinary(int value){
   for (int i = 0; i < Math.pow(2, value); i++) {
       System.out.println(Integer.toBinaryString(i));
   }
}

类似这样的前导零

    for (int i = 0; i < Math.pow(2, value); i++) {
        StringBuilder binary = new StringBuilder(Integer.toBinaryString(i));
        for(int j = binary.length(); j < value; j++) {
            binary.insert( 0, '0' );
        }
        System.out.println(binary);
    }

【讨论】:

  • Integer.toBinaryString(i) 的大小是否为“值”位?
  • +1 表示简洁。这将为 0 而不是 0000 打印 0。@asker 应该添加逻辑来填充零。
【解决方案3】:

要么使用 phoxis 的非常好的解决方案,要么只是按字典顺序迭代它们(这实际上是相同的解决方案!):给定一个给定长度的二进制字符串,通过找到最右边的零条目来获取下一个字典字符串,将其更改为1,并将其右侧的所有内容更改回0,例如

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

【讨论】:

    【解决方案4】:

    对于您如何将动态编程应用于此,我有点迷茫。只需从 0 计数到比指​​定最大值小 1(其中最大值为 1 左移指定位数)。

    编辑:我应该补充一点,还有其他可能性(例如格雷码),但没有其他理由,简单的二进制计数可能是最容易实现的。

    【讨论】:

    • 提问者说“我正在处理一个涉及此逻辑的问题”,请注意“涉及”
    • @phoxis 这个问题有动态编程标签。如果动态规划与问题无关,添加标签并提及它只会混淆问题。
    • 问题标签无效,我同意,而且绝对令人困惑。
    【解决方案5】:
    int x = 5;
    
    for(int i = 0; i < (1 << x); i++){ 
     System.out.println(Integer.toBinaryString(i)); 
    }
    

    【讨论】:

    • 你应该包括你的答案的解释。
    【解决方案6】:

    这里是找组合的代码

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package rotateimage;
    
    /**
     *
     * @author ANGEL
     */
    public class BinaryPermutaion {
    
        public static void main(String[] args) {
            //object creation
            BinaryPermutaion binaryDigit=new BinaryPermutaion();
            //Recursive call of the function to print the binary string combinations
            binaryDigit.printBinary("", 4);
        }
    
        /**
         * 
         * @param soFar String to be printed
         * @param iterations number of combinations
         */
        public void printBinary(String soFar, int iterations) {
        if(iterations == 0) {
            System.out.println(soFar);
        }
        else {
            printBinary(soFar + "0", iterations - 1);
            printBinary(soFar + "1", iterations - 1);
        }
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2016-04-07
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多