对于我正在努力完成的任务,我有一个简短的问题。我正在编写一个带有三位数参数(0-9)的布尔方法,如果可以重新排列组成一个序列,则返回true。对我来说,困难的部分是0可以制作8,9或1,2的序列。假设三个数字都不同。要清楚,数字5,7,6是正确的,因为它可以重新排列为5,6,7,一个序列。 8,0,9也将返回true,但2,4,7不会。我希望有人能指出我正确的方向,任何帮助都会非常感激!
答案 0 :(得分:0)
您只需要检查两个测试的有效性:
这会给你以下方法:
public static boolean isSequence(int a, int b, int c) {
if(a == 0) a = 10;
if(b == 0) b = 10;
if(c == 0) c = 10;
//Add the commented-out lines to make it safe to use with non-different numbers.
//boolean allDifferent = !(a == b) && !(b == c) && !(a == c);
boolean extremesIsTwo = Math.abs(Math.max(Math.max(a, b), c)
- Math.min(Math.min(a, b), c)) == 2;
//return allDifferent && extremesIsTwo;
return extremesIsTwo;
}
当你看到它时,它只是一个简单的逻辑问题,并找到答案的最短路径。可能有更优化的方法来做到这一点,但这很清楚,可读并且工作得很好。
现在,如果你真的想要研究类似的问题,你可以尝试优化这个算法,或者找另一种方法来检查三个数字是一个序列。
编辑此版本可扩展。即使你的要求是三个参数,我仍然会考虑这个解决方案,因为它使用OOP来避免重复代码。根据要求,它也不会检查重复项。
public static boolean isSequenceScalable(List<Integer> list) {
list = list.stream().map(i -> i = (i == 0) ? 10 : i).collect(Collectors.toList());
list.sort(Integer::compareTo);
if (Math.abs(list.get(0) - list.get(list.size() - 1)) == 2) return true;
return false;
}