当返回类型只是int时,如何返回多个整数?

时间:2016-03-14 12:59:56

标签: java

我必须实现以下功能:

public int solution(int[] A) {
    // smth
}

但是,这个函数可能有零个或多个解,我的意思是没有解决方案(然后应该返回-1),一个解决方案,两个解决方案等等。正如您所看到的那样,函数只有int作为返回类型(不是数组)我无法改变它。我该怎么办,例如这个函数应该返回两个值(5和9)还是三个值(1,10和7)?我该如何归还?

我想过元组,但我相信有更好的解决方法。

4 个答案:

答案 0 :(得分:1)

为什么不使用加密?这只适用,如果您的解决方案和解决方案数量很少,并且您知道两个上限(解决方案的数量和解决方案的最大大小),但您可以将更多信息放在一个int中。此处mult是一个大于最大预期解决方案的数字:

public int solution(int[] A) {
    int returnValue = 0;
    //solution is an array of your solutions
    for(i=0; i<solution.length; i++){
        returnValue=returnValue*mult;
        returnValue+=solution[i];
    }
    return returnValue;
}

public List<Integer> retrieveSolutions(int solution){
    List<Integer> decryptedSolutions = new ArrayList<>();
    while(solution>mult){
        decryptedSolutions.add(solution%mult);
        solution = (int) solution/mult;
    }
    return decryptedSolutions;
}

请注意案例解决方案= 0在这里被忽略,你可能会得到比整数的最大值更大的值(因此你必须确保,你的upperBound + 1(= mult)幂是最大数量的解决方案+ 1小于整数的最大值)。负面解决方案也会破坏这一点(如果你知道解决方案的下限,你可以避免这种情况)。另一种方法是(如评论中所述)将解决方案放在参数中给出的可变对象中:

在Peter的答案中指出的数组中的任何一个(仅作用,如果参数数组中的元素多于您的解决方案),现在您在给定数组中有解决方案,并且返回值表示您获得了多少解决方案:

public int solution(int[] A) {
    int numberSolutions = solutions.length;
    for(int i=0; i<solutions.length; i++){
        A[i]=solutions[i];
    }
    return numberSolutions;
}

或在额外的&#34;包&#34;

public int solution(int[] A, NumberBag putTheSolutionsHere) {
   // puts solutions in your NumberBag, whatever Object you might want to use here (preferable List implementation)
}

答案 1 :(得分:0)

如果无法更改签名,则只有选项才能更改输入。虽然这将是最糟糕的解决方案,但它可能是您唯一的解决方案。您可以返回解决方案的数量。 e.g。

// return all the positive numbers
public int solution(int[] array) {
   // put all the positive numbers at the start.
   return numOfPositives;
}

更好的解决方案是返回结果数组

public int[] solution(int[] input)

答案 2 :(得分:0)

如果您无法更改该功能,请将其重载 - 使用不同的签名编写相同的功能。

more on overloading

答案 3 :(得分:0)

如果您可以为签名添加一个参数,请添加任何Collection,该方法将填充Collection(无关紧要)。

如果您无法更改签名而无法更改返回类型:是否有充分理由?与要求你这样做的人讨论。

如果有充分的理由(或者它是一种算法练习),您可以使用一些位屏蔽。在java中,int以32位编码。如果可能的解决方案很小,您可以将这些32位分成小组并将每个解决方案存储在一个组中。

这是一个解决方案,展示了如何使用4位组在[0; 15]中存储多达8个解决方案:

public static void main(String[] args) throws Exception {

  List<Integer> values = Arrays.asList(5, 7, 3, 8, 9);
  String collect = values.stream().map(Object::toString).collect(Collectors.joining(", "));
  System.out.println("Values to encode : "+collect);

  int _1111 = (2 << 3) - 1;
  System.out.println("\nMasks : ");
  for (int i = 0; i < values.size(); i++) {
    System.out.println(padWith0(Integer.toString(_1111 << 4 * i, 2)));
  }

  System.out.println("\nEncoding : ");
  int result = 0;
  for (int i = 0; i< values.size() ; i++) {
    int partial = values.get(i) << (4 * i);
    System.out.println(values.get(i) +" => " + padWith0(Integer.toString(partial, 2)));
    result += partial;
  }
  System.out.println("  => "+Integer.toString(result, 2));

  System.out.println("\nRestitution : ");

  for(int i = 0; i< values.size(); i++) {
    int mask = _1111 << (4 * i);
    int partial = (result & mask) >> (4 * i);
    System.out.println(Integer.toString(partial, 2) +" => " + partial);
  }
}

public static String padWith0(String s) {
  return ("00000000000000000000000000000000" + s).substring(s.length());
}

输出:

Values to encode : 5, 7, 3, 8, 9

Masks : 
00000000000000000000000000001111
00000000000000000000000011110000
00000000000000000000111100000000
00000000000000001111000000000000
00000000000011110000000000000000

Encoding : 
5 => 00000000000000000000000000000101
7 => 00000000000000000000000001110000
3 => 00000000000000000000001100000000
8 => 00000000000000001000000000000000
9 => 00000000000010010000000000000000
  => 00000000000010011000001101110101

Restitution : 
101 => 5
111 => 7
11 => 3
1000 => 8
1001 => 9