当前位置: 移动技术网 > IT编程>开发语言>Java > 牛客网-腾讯编程校招真题 游戏任务标记 Java

牛客网-腾讯编程校招真题 游戏任务标记 Java

2020年08月10日  | 移动技术网IT编程  | 我要评论
题目描述:游戏里面有很多各式各样的任务,其中有一种任务玩家只能做一次,这类任务一共有1024个,任务ID范围[1,1024]。请用32个unsigned int类型来记录着1024个任务是否已经完成。初始状态都是未完成。 输入两个参数,都是任务ID,需要设置第一个ID的任务为已经完成;并检查第二个ID的任务是否已经完成。 输出一个参数,如果第二个ID的任务已经完成输出1,如果未完成输出0。如果第一或第二个ID不在[1,1024]范围,则输出-1。输入描述:输入包括一行,两个整数表示人物ID.输出描述

题目描述:

游戏里面有很多各式各样的任务,其中有一种任务玩家只能做一次,这类任务一共有1024个,任务ID范围[1,1024]。请用32个unsigned int类型来记录着1024个任务是否已经完成。初始状态都是未完成。 输入两个参数,都是任务ID,需要设置第一个ID的任务为已经完成;并检查第二个ID的任务是否已经完成。 输出一个参数,如果第二个ID的任务已经完成输出1,如果未完成输出0。如果第一或第二个ID不在[1,1024]范围,则输出-1。
输入描述:
输入包括一行,两个整数表示人物ID.
输出描述:
输出是否完成

思路:

思路是Bitmap

代码中id1,id2之所以减1,我的理解是,防止越界.不减1,若id1等于1024,id1除以32等于32,但res数组长度是32,下标范围是0~31,所以不减一会越界.

代码:

import java.util.Scanner;
public class Main{
    static int[] res = new int[32];
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int id1 = scan.nextInt();
        int id2 = scan.nextInt();
        if(id1 < 1 || id1 > 1024 || id2 < 1 || id2 > 1024){
            System.out.println(-1);
            return;
        }
        int a = (id1 - 1) / 32;//id1处于第几个元素
        /*res[a]的十进制数是多少不重要,重要的是res的下标.把1~1024划分成32分,res的下标表示这32份.
        res数组是整形int数组,每一个元素是4个字节,即32位,用这32位表示32份中的一份,32*32=1024
        一个位的1或0,表示一个数的有无*/
        /*id1用res[a]这个数(二进制形式)的从右往左数第(id2-1)%32的位表示存在与否.
        要把这一位设为1,所以把1(二进制形式)最右边的那个1向左移动(id1-1)%32位,然后采用位运算'|',把那一位设为1.*/
        res[a] = res[a] | (1 << (id1-1)%32);
        int b = (id2 - 1) / 32;
        /*用二进制运算'&'判断res[b](二进制形式)从右往左数第(id2-1)%32的位是1还是0*/
        int tmp = res[b] & (1 << (id2-1)%32);
        if(tmp != 0){
            System.out.println(1);
        }else{
            System.out.println(0);
        }
        
    }
}

本文地址:https://blog.csdn.net/weixin_43260719/article/details/107858469

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网