|
|
@@ -29,7 +29,7 @@ public class NumberStringSubtraction {
|
|
|
|
|
|
for (int aNum : aNumbers) {
|
|
|
// 在b数字中找到最接近且小于等于aNum的数字
|
|
|
- int bestB = findClosestLessOrEqual(aNum, sortedBNumbers);
|
|
|
+ int bestB = findClosestWithPreference(aNum, sortedBNumbers);
|
|
|
result.add(aNum - bestB);
|
|
|
}
|
|
|
}
|
|
|
@@ -37,27 +37,49 @@ public class NumberStringSubtraction {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- private static int findClosestLessOrEqual(int aNum, List<Integer> sortedBNumbers) {
|
|
|
- // 默认值,如果没有找到合适的就用0
|
|
|
- int closest = 0;
|
|
|
+ private static int findClosestWithPreference(int aNum, List<Integer> sortedBNumbers) {
|
|
|
+ // 如果b列表为空,返回0
|
|
|
+ if (sortedBNumbers.isEmpty()) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 找到所有与aNum差值最小的数字
|
|
|
+ List<Integer> closestNumbers = new ArrayList<>();
|
|
|
int minDiff = Integer.MAX_VALUE;
|
|
|
|
|
|
for (int bNum : sortedBNumbers) {
|
|
|
- if (bNum <= aNum) {
|
|
|
- int diff = aNum - bNum;
|
|
|
- if (diff < minDiff) {
|
|
|
- minDiff = diff;
|
|
|
- closest = bNum;
|
|
|
- }
|
|
|
+ int diff = Math.abs(aNum - bNum);
|
|
|
+ if (diff < minDiff) {
|
|
|
+ minDiff = diff;
|
|
|
+ closestNumbers.clear();
|
|
|
+ closestNumbers.add(bNum);
|
|
|
+ } else if (diff == minDiff) {
|
|
|
+ closestNumbers.add(bNum);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果只有一个最接近的数字,直接返回
|
|
|
+ if (closestNumbers.size() == 1) {
|
|
|
+ return closestNumbers.get(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果有多个相同接近的数字,优先选择大于aNum的
|
|
|
+ List<Integer> greaterThanA = new ArrayList<>();
|
|
|
+ for (int num : closestNumbers) {
|
|
|
+ if (num > aNum) {
|
|
|
+ greaterThanA.add(num);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 如果没有找到小于等于aNum的b数字,就使用最小的b数字
|
|
|
- if (minDiff == Integer.MAX_VALUE && !sortedBNumbers.isEmpty()) {
|
|
|
- closest = sortedBNumbers.get(0);
|
|
|
+ // 如果有大于aNum的数字,返回其中最小的
|
|
|
+ if (!greaterThanA.isEmpty()) {
|
|
|
+ Collections.sort(greaterThanA);
|
|
|
+ return greaterThanA.get(0);
|
|
|
}
|
|
|
|
|
|
- return closest;
|
|
|
+ // 如果没有大于aNum的数字,返回最大的那个(最接近但小于等于aNum的)
|
|
|
+ Collections.sort(closestNumbers);
|
|
|
+ return closestNumbers.get(closestNumbers.size() - 1);
|
|
|
}
|
|
|
|
|
|
private static List<Integer> parseNumbers(String str) {
|