牛客网-腾讯编程校招真题 游戏任务标记 Java
程序员文章站
2022-03-11 11:58:24
题目描述:游戏里面有很多各式各样的任务,其中有一种任务玩家只能做一次,这类任务一共有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
上一篇: 7-3 简化的插入排序 (15分)