已知Solution
import java.util.Arrays; public class Solution { private void add(int[] diff, int l, int r, int v) { if (l > r) return; diff[l] += v; if (r + 1 < diff.length) { diff[r + 1] -= v; } } private void update(int[] diff, int i, int x, int y, int n) { add(diff, y - i, n - i, -1); // 撤销 [y,n] int dec = y - x - 1; // 缩短的距离 add(diff, y - i - dec, n - i - dec, 1); int j = (x + y + 1) / 2 + 1; add(diff, j - i, y - 1 - i, -1); // 撤销 [j, y-1] add(diff, x - i + 2, x - i + y - j + 1, 1); } private void update2(int[] diff, int i, int x, int y, int n) { add(diff, y - i, n - i, -1); // 撤销 [y,n] int dec = (y - i) - (i - x + 1); // 缩短的距离 add(diff, y - i - dec, n - i - dec, 1); int j = i + (y - x + 1) / 2 + 1; add(diff, j - i, y - 1 - i, -1); // 撤销 [j, y-1] add(diff, i - x + 2, i - x + y - j + 1, 1); } public int[] countOfPairs(int n, int x, int y) { if (x > y) { int temp = x; x = y; y = temp; } int[] diff = new int[n + 2]; for (int i = 1; i <= n; i++) { add(diff, 1, i - 1, 1); add(diff, 1, n - i, 1); if (x + 1 >= y) { continue; } if (i <= x) { update(diff, i, x, y, n); } else if (i >= y) { update(diff, n + 1 - i, n + 1 - y, n + 1 - x, n); } else if (i < (x + y) / 2) { update2(diff, i, x, y, n); } else if (i > (x + y + 1) / 2) { update2(diff, n + 1 - i, n + 1 - y, n + 1 - x, n); } } for (int i = 1; i <= n; i++) { diff[i] += diff[i - 1]; } return Arrays.copyOfRange(diff, 1, n + 1); } }
法一:
使用反射获取最后一个方法,但是报
说明参数数量不对
我打印了targetMethod 发现根本不是countOfPairs
然后我又打印methods,发现
对methods做了过滤,因为它返回的是 Solution
类及其所有父类(包括 Object
类)中所有公共方法的数组
现在就对了
但是我还有一个疑问,那就是solution里还有add,update等方法呀,怎么没打印出来呢?
原因是当你调用 Solution.class.getMethods()
时,它返回的是 Solution
类及其所有父类(包括 Object
类)中所有公共方法的数组。这意味着 getMethods()
只返回公共(public
)方法。
法二:
每次顺序都不一样,不可取
所以最好的方法是
Method targetMethod = null; for (Method method : methods) { if (method.getName().equals("countOfPairs") && method.getParameterCount() == inputData.length) { targetMethod = method; break; } }
指定方法名,这样就永远不会错了