欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-25 16:16:59
题目描述:游戏里面有很多各式各样的任务,其中有一种任务玩家只能做一次,这类任务一共有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