1.(0.01,0.99)区间内的一个小数a,求一个真分数n/m:
①m<200
②如果有两个与a同样接近(比如1/2与1/4相对于0.375)则取分子分母之和较小的。
public static int[] getFraction(float a) {
int[] res = new int[2];
float x = 1;
for (float i = 1; i < 200; ++i) {
for (float j = i + 1; j <= 200; ++j) {
float d = Math.abs((i / j) - a);
if (d < x || (d == x && (res[0]+res[1]) > (i+j))) {
res[0] = (int) i;
res[1] = (int) j;
x = d;
}
}
}
return res;
}
2.网格盘上,有n个点(n>3),点的位置在横线与纵线的交叉点上。沿着网格画线条,线条可以转弯,把点连起来,达到3颗即算成串。求最短线条长度。
public static int getMinLength (int[][] pearls) {
// write code here
int row = pearls.length;
List<List<Integer>> lists = new ArrayList<>();
for (int[] q : pearls) {
List<Integer> list = new ArrayList<>();
for (int[] h : pearls) {
if (q == h) {
continue;
}
int d = Math.abs(q[0] - h[0]) + Math.abs(q[1] - h[1]);
list.add(d);
}
lists.add(new ArrayList<>(list));
}
int min = Integer.MAX_VALUE;
for (List<Integer> list1 : lists) {
int sum = 0;
Collections.sort(list1);
for (int i = 0; i < 2; i++) {
sum += list1.get(i);
}
min = Math.min(sum, min);
}
return min;
}