8.18阿里笔试题解思路参考
8.18阿里笔试个人题解思路
以下均为个人解题思路,仅供参考!
第一题
两步:1)找到非对角点的那一个点,设为(x0, y0), 另外两个对角点为(x1, y1), (x2, y2),求 (x, y);
2) 有关系,y = y1 + y2 - y0; x = x1 + x2 - x0;
代码如下:
import java.util.Scanner;
public class Solution1 {
public static void main(String[] args) {
/**
* 两步:
* 1)找到非对角点的那一个点,设为(x0, y0), 另外两个对角点为(x1, y1), (x2, y2),求 (x, y);
* 2) 有关系,y = y1 + y2 - y0; x = x1 + x2 - x0;
*/
Scanner sc = new Scanner(System.in);
int[][] ins = new int[3][2];
for (int i = 0; i < 3; i++) {
ins[i][0] = sc.nextInt();
ins[i][1] = sc.nextInt();
}
// Handle
handle(ins);
}
private static void handle(int[][] ins) {
// 1 找出非对角线上的点
for(int i = 0; i < 3; i ++){
swap(ins, 0, i);
if(isValid(ins))
break;
}
// 2 利用公式计算
int x = ins[1][0] + ins[2][0] - ins[0][0];
int y = ins[1][1] + ins[2][1] - ins[0][1];
System.out.println(x + " " + y);
}
// 如果某个点与其他两个点的距离一样,那么说明该点是输入中的非对角点
private static boolean isValid(int[][] ins) {
int x1 = (int)(Math.pow((ins[0][0] - ins[1][0]), 2) + Math.pow((ins[0][1] - ins[1][1]), 2));
int x2 = (int)(Math.pow((ins[0][0] - ins[2][0]), 2) + Math.pow((ins[0][1] - ins[2][1]), 2));
return x1 == x2;
} private static void swap(int[][] ins, int a, int b){
int[] temp = ins[a];
ins[a] = ins[b];
ins[b] = temp;
}
} 第二题
1) 数据处理, 将人工通道和天然通道合并为代码中的 `channels`, 不可达的点专门用数组表示,问题就变得简单了
2)使用`used`数组表示,是否之前到达过该点,如果到达过,则返回;
3)这就是简单的回溯算法了;
public class Solution2 {
private static int rst = Integer.MAX_VALUE;
/* 示例
6 2 2 0
9 1 6 3 6
2 5 1
3 6 2
1 5 3
6 5 9
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// int examples = sc.nextInt();
// sc.nextLine();
for (int i = 0; i < 1; i++) {
int n = sc.nextInt(), m = sc.nextInt(), k = sc.nextInt(), p = sc.nextInt();
sc.nextLine();
int[] costs = new int[n - 1];
for (int j = 0; j < n - 1; j++) {
costs[j] = sc.nextInt();
}
sc.nextLine();
int[][] channels = new int[m * 2 + k][3];
int[][] arts = new int[m][3];
int j = 0;
for (; j < m * 2 + k ;j += 2) {
channels[j][0] = sc.nextInt();
channels[j][1] = sc.nextInt();
channels[j][2] = sc.nextInt();
channels[j + 1][0] = channels[j][1];
channels[j + 1][1] = channels[j][0];
channels[j + 1][2] = channels[j][2];
sc.nextLine();
}
int[][] nature = new int[k][3];
for (; j < m * 2 + k; j++) {
nature[j][0] = sc.nextInt();
nature[j][1] = sc.nextInt();
nature[j][2] = sc.nextInt();
sc.nextLine();
}
int[] cannot = new int[n];
for (int x = 0; x < p; x++) {
cannot[sc.nextInt() - 1] = -1;
}
int[] used = new int[n]; // 是否已经达到过该点
for (int x = 0; x < channels.length; x++) {
System.out.println(Arrays.toString(channels[x]));
}
System.out.println("cannot = " + Arrays.toString(cannot));
handle(costs, channels, cannot, n, used, 1, 0);
System.out.println(rst == Integer.MAX_VALUE ? -1 : rst);
rst = Integer.MAX_VALUE;
}
}
private static void handle(int[] costs, int[][] channels, int[] cannot, int n, int[] used, int next, int total) {
if (used[next - 1] == 1 || cannot[next - 1] == -1)
return;
if (next == n) {
rst = Math.min(rst, total);
return;
}
used[next - 1] = 1;
handle(costs, channels, cannot, n, used, next + 1, total + costs[next - 1]);
used[next - 1] = 0;
for (int i = 0; i < channels.length; i++) {
if(channels[i][0] == next){
used[next - 1] = 1;
handle(costs, channels, cannot, n, used, channels[i][1], total + channels[i][2]);
used[next - 1] = 0;
}
}
}
}
查看11道真题和解析