开宝箱(Java8)
我在参与腾讯校招机考的时候做过类似的题(当然比这个难了),是宝箱和钥匙匹配的题,所以想找个类似的题目做做,然后就搜到这题,对于算法效率和能不能通过测试我不清楚,因为没有找到题目来源,java代码仅供参考。c/c++解法参考
Description:
急先锋是一个商人,有一天找到了一个宝箱,宝箱需要正确的密码才能打开。同时他发现宝箱上有一个数字,和一份密码表。密码表上有n个密码,只有一个密码是正确的。
急先锋所在的岛上有m个地点,每个地点有两个神秘的数字。他通过交易得到每个地点上拥有的信息,也知道这个宝箱上的数字是一个地点的标号x。急先锋需要先到x号地点,x号地点上的第一个数字就是他要去的最终地点的标号,最终的地点上的第二个数字就是密码在密码表上的序号。急先锋想要知道打开这个宝箱的密码,聪明的你能不能直接告诉他呢?
Input:
第一行两个数字n,m.(1<=n,m<=20)
接下来n个数字ai表示密码表上序号1到序号n的密码分别是多少。(1 <=ai<=100)
接下来m行每行两个数字u,v。(1 <= u<=m,1<= v <=n)
然后给你一个T,表示T次询问。(1<=T<= 20)
接下来的T行每行一个x,表示宝箱上的数字。(1<=x<=m)
Output:
一共T行。每行一个数字表示最后的密码。
Sample Input
5 4
1 2 3 4 5
2 4
3 3
1 2
2 5
2
1
2
Sample Output
3
2
题目解析:根据题意和测试用例可知,T行数的每一行代表一个宝箱上的数,宝箱上的数代表地点,地点里第一个数u[i]代表最终地点,最终地点的第二个数v[i]代表密码在密码表a[i]上的位置即索引,所以可得a[ v[ u[ x[ ] ] ] ] 即为宝箱密码。
下附上java8伪代码:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();//键盘输入n
int m = in.nextInt();//键盘输入m
int[] a = new int[n];//数字a存放密码表
int[] u = new int[n];//数组u存放地点x第一个数
int[] v = new int[v];//数组v存放地点x第一个数
for (int i = 0;i < n;i++){
a[i] = in.nextInt();//输入密码表
}
for (int j = 0;j < m;j++){
u[j] = in.nextInt();//输入地点x第一个数
v[j] = in.nextInt();//输入地点x第二个数
}
int T = in.nextInt();//输入询问次数T
int[] x = new int[T];//数组x存放宝箱上的数字
for (int k = 0;k < T;k++ ){
x[k] = in.nextInt();//输入宝箱上的数组
}
for (int k = 0;k < T;k++ ){
/*因为数组洗标是从0开始的,但输入数是从1开始的自然数所以此处-1*/
int p =a[v[u[x[k]-1]-1]-1];//用p存储密码
System.out.println(p);//输出密码
}
}
}
输入输出结果如下:最后两行为输出
5 4
1 2 3 4 5
2 4
3 3
1 2
2 5
2
1
2
3
2
下附上int p =a[ v[ u[x[ k ] ] ] ]结果的实现伪代码:
import java.util.Scanner
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();//键盘输入n
int m = in.nextInt();//键盘输入m
int[] a = new int[n+1];//数字a存放密码表
int[] u = new int[n+1];//数组u存放地点x第一个数
int[] v = new int[m+1];//数组v存放地点x第一个数
for (int i = 1;i <=n;i++){
a[i] = in.nextInt();//输入密码表
}
for (int j = 1;j <= m;j++){
u[j] = in.nextInt();//输入地点x第一个数
v[j] = in.nextInt();//输入地点x第二个数
}
int T = in.nextInt();//输入询问次数T
int[] x = new int[T];//数组x存放宝箱上的数字
for (int k = 0;k < T;k++ ){
x[k] = in.nextInt();//输入宝箱上的数组
}
for (int k = 0;k < T;k++ ){
int p =a[v[u[x[k]]]];//用p存储密码
System.out.println(p);//输出密码
}
}
}