我想要一个组合算法,......要将数组中的元素多个,除了它自己之外的所有其他元素......
请帮我组合eg :: {1,2,3,4,5,6}
输出:: 1 * 2,1 * 3 .... 1 * 6,1 * 2 * 3!* 2 * 4 ....... 1 * 2 * 3 * 4 * 5 * 6。 ...... 5 * 6
代码被删除它与我对问题的逻辑要求无关......
答案 0 :(得分:1)
为什么不从一开始就将arr
声明为Set
?
Set<Integer> arr = new LinkedHashSet<Integer>();
然后离开它。您永远不会想要重复,如果订单很重要,LinkedHashSet会保留插入顺序。
答案 1 :(得分:1)
首先,找到因素。这是我自己代码中的一个片段。它会在名为target
的{{1}}中构建ArrayList
因子列表。当找到每个因子时,它被记录一次并根据需要分出多个时间。然后相应地降低上限。变量factors
包含residue
的未计算部分。
target
我使用了两种自己的功能:
int trialFactor = 0;
int residue = target;
limit = iSqrt(residue);
while (trialFactor < limit) {
trialFactor = nextPrime(trialFactor);
if (residue % trialFactor == 0) {
factors.add(trialFactor);
do {
// Remove repeated factors.
residue /= trialFactor;
} while (residue % trialFactor == 0);
limit = iSqrt(residue);
}
}
// Record largest factor, if present.
if (residue > 1) { factors.add(residue); }
返回下一个最高素数。
int nextPrime(int)
返回整数平方根; int iSqrt(int)
返回3.
现在问题的第二部分,组合。你有一组物品,你想要所有可能的组合。如果有n项,则只需遍历所有数字0到(2 ^ n) - 1.这将为您提供从000 ... 000到111 ... 111的所有位模式。对于组中的每个位置a “0”表示不将其包含在输出中,而“1”表示包含它。
所以,考虑到你的{1,2,3,4,5,6}示例,你需要从0到2 ^ 6 - 1 = 63的数字。举一个例子,45是二进制的101101,所以你的输出为45是{1,3,4,6}。
答案 2 :(得分:1)
我相信这就是你要找的东西:
//This method return a list of lists, where each "inner list" contains as
//its first number the number for which the factors are being found, and
//every other number is a factor.
//It takes an array of all the numbers whose factor you wish to find
public List<List<Integer>> getAllFactors(int[] toCalculate){
List<List<Integer>> toReturn = new ArrayList<List<Integer>>();
List<Integer> factors;
for(int i = 0; i < toCalculate.length; i++){
factors = new ArrayList<Integer>();
factors.add(toCalculate[i]); //add the number whose factors will be calculated
//the square root is used because it is the largest number you can divide by without getting "overlap"
for(int j = 1; j <= Math.sqrt(toCalculate[i]); j++){
if(toCalculate[i]%j==0){ //if it divides evenly, add it
factors.add(j);
factors.add((Integer)toCalculate[i]/j); //also add its "partner" number
}
}
toReturn.add(factors);
}
return toReturn;
}
我放入课程Test
...这是我的测试方法:
public static void main(String[] args){
Test t = new Test();
List<List<Integer>> blah = t.getAllFactors(new int[]{10, 12, 1, 5});
for(List<Integer> i: blah)
System.out.println(Arrays.toString(i.toArray(new Integer[i.size()])));
}
我意识到这不是问题所要求的......我想......我不能说...... 无论如何,我写了另一种方法:
public List<Integer> getAllFactors(int number){
List<Integer> factors = new ArrayList<Integer>();
for(int i = 2; i <= Math.sqrt(number); i++){
if(number%i==0){
factors.add(number);
factors.addAll(getAllFactors(i));
factors.addAll(getAllFactors(number/i));
}
}
if(factors.isEmpty())
factors.add(number);
return factors;
}
然后我意识到这可能不是你想要的。事实是,我实际上没有任何想法,你无法理解你的帖子。我一直试图从评论中收集信息。