急先锋开宝箱问题(Java实现)

开宝箱(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);//输出密码
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ALIM MUSA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值