我必须实现以下功能:
public int solution(int[] A) {
// smth
}
但是,这个函数可能有零个或多个解,我的意思是没有解决方案(然后应该返回-1),一个解决方案,两个解决方案等等。正如您所看到的那样,函数只有int
作为返回类型(不是数组)我无法改变它。我该怎么办,例如这个函数应该返回两个值(5和9)还是三个值(1,10和7)?我该如何归还?
我想过元组,但我相信有更好的解决方法。
答案 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)
如果您无法更改该功能,请将其重载 - 使用不同的签名编写相同的功能。
答案 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