360后端笔试算法题秋决

题目描述:有n个黑白棋子,他们的一面是黑色,一面是白色。他们被排成一行,位置可以用标号1~n来表示。一开始,所有的棋子都是黑色向上,有q次操作,每次操作将位置标号在区间[L,R]内的所有棋子翻转(原来黑色变白色,原来白色变黑色)。请在每次操作后,求这n个棋子中,黑色向上的棋子个数。

输入描述:第一行两个整数 n,q, 1<= n <= 1018, q <= 300; 后面q行,每行两个整数L,R, 1 <= L <= R <= n。

输出描述:q行,每行一个整数,表示每次操作后黑色向上的棋子个数。

本人回答:

import java.util.Scanner;

public class Points {

    //计算目前黑色棋子向上的数量
    public static void calcu(boolean[] points) {
        int sum = 0;
        for(int i=1;i<points.length;i++) {
            if(!points[i])  sum += 1;
        }
        System.out.println("黑色棋子个数:"+sum);
    }

    //对left<=序号<=right,这范围内的棋子进行翻转操作
    public static void upsideDown(boolean[] points, int left, int right) {
        for(int i=left;i<=right;i++) {
            points[i] = !points[i];
        }
        calcu(points);
    }
    public static void main(String[] args) {
        //输入棋子总数和翻转次数
        Scanner scanner = new Scanner(System.in);
        System.out.println(Integer.MAX_VALUE);
        int n = scanner.nextInt();
        int q = scanner.nextInt();
        //生成一个对应的棋子数组,用false代表该棋子目前是黑色向上,points[1]代表第一个棋子,points[n]代表第n个棋子
        boolean[] points = new boolean[n+1];
        for(int i=0;i<q;i++) {
            upsideDown(points, scanner.nextInt(), scanner.nextInt());
        } 
        scanner.close();
    }
}
从题目描述来看并不难,我通过简单的方法解决了1<=n<=2147483646(Integer.MAX_VALUE-1)的情况,但是当2147483647 <= n<= 1018时这个方法就不奏效了,请问一下各位路过的大佬有解决的方案吗wuwuwu
#2022春招##360公司##笔试题目#
全部评论
这个代码是ac通过的吗?
2 回复 分享
发布于 2022-03-22 18:43
可以看我的帖子有代码,也是360笔试
点赞 回复 分享
发布于 2022-03-27 00:41

相关推荐

不愿透露姓名的神秘牛友
11-21 19:05
点赞 评论 收藏
分享
shtdbb_:还不错,没有让你做了笔试再挂你
点赞 评论 收藏
分享
9 4 评论
分享
牛客网
牛客企业服务