一道头条笔试题:求区间的个数

给定两个长度都为N的整型数组a[N]和b[N],求满足如下条件的闭区间个数:在区间[l,r]上,a中的任意元素都比b中的任意元素小。

这个问题是O(N)复杂度。
关键在于发现一个规律:如果在区间[l+d,r]上满足上述条件,那么在更小的区间上[l,r]必然也满足上述条件,所以就可以用一个指针不停往后走。

import java.util.Scanner;

public class Main {

Main() {
    Scanner cin = new Scanner(System.in);
    int n = cin.nextInt();
    int[] a = new int[n];
    int[] b = new int[n];
    for (int i = 0; i < n; i++) a[i] = cin.nextInt();
    for (int i = 0; i < n; i++) b[i] = cin.nextInt();
    int s = 0;
    for (int i = 0; i < n; ) {
        if (a[i] >= b[i]) {
            i++;
            continue;
        }
        int ma = Integer.MIN_VALUE, mi = Integer.MAX_VALUE;
        int r = i;
        for (; r < n; r++) {
            ma = Math.max(a[r], ma);
            mi = Math.min(b[r], mi);
            if (mi <= ma) break;
        }
        s += (r - i + 1) * (r - i) / 2;
        if (i == r) i++;
        else i = r;
    }
    System.out.println(s);
}

public static void main(String[] args) {
    new Main();
}
}

原文地址:https://www.cnblogs.com/weiyinfu/p/9499427.html

时间: 2024-10-11 03:54:23

一道头条笔试题:求区间的个数的相关文章

头条笔试题2018后端第二批

头条笔试题2018后端第二批 标签(空格分隔): 笔试题 描述:为了不断优化推荐效果,今日头条每天要存储和处理海量数据.假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k.因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1). 输入描述: 输入: 第1行为n代表用户的个数 第2行为n个整数,

2018春招-今日头条笔试题-第三题(python)

题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 本题的做法最重要的应该是如何拼出'1234567890',对于输入表达试获得对应的结果利用python内置函数eval()即可以实现.利用5个字符串来表达'1234567890',如下(为了好看,里面加了tab空格符) '66666 ....6 66666 66666 6...6 66666 66666 66666 66666 66666''6...6 ....6 ....6 ....6 6...6 6.... 6

今日头条笔试题 1~n的每个数,按字典序排完序后,第m个数是什么?

# 由于n和m都是10^18的范围,暴力明显不行,只能dfs了.# 先预处理n的十进制,存到num数组中,长度计算出来为len, 答案存到Num中.# 写个函数cntOfBeginNum(int *Num,int anslen),计算以num为前缀的小于等于n的数的个数cnt,考虑长度比n的十进制长度小的数,则cnt+=1+10+100+1000......# 长度和n相等的则要特判一下,前缀Num和num的前缀有3种关系,> = < ,先判断是哪种,再计算.# 然后考虑答案的最高位非0,我们

[2013百度软件研发笔试题] 求字符串中连续出现同样字符的最大值

题目完整描写叙述为:用递归的方式实现一个求字符串中连续出现同样字符的最大值.如aaabbcc,连续出现a的最大值为3,abbc,连续出现字符最大的值为2. 下面是我想出来的方法: #include <iostream> using namespace std; #define MAX(a, b) (a) > (b) ? (a) : (b) int Get(char *s, int n, int m)  //字符指针, 当前最长串, max最长串 {     if(*(s+1) == '\

[2013百度软件研发笔试题] 求字符串中连续出现相同字符的最大值

题目完整描述为:用递归的方式实现一个求字符串中连续出现相同字符的最大值,如aaabbcc,连续出现a的最大值为3,abbc,连续出现字符最大的值为2. 以下是我想出来的方法: #include <iostream> using namespace std; #define MAX(a, b) (a) > (b) ? (a) : (b) int Get(char *s, int n, int m)  //字符指针, 当前最长串, max最长串 {     if(*(s+1) == '\0'

2017头条笔试题:二维点集中找出右上角没有点的点并按x坐标从小到大打印坐标

PS:这篇是之前本来就想发的但是一直没时间写,加上今天做了京东的题,结果代码名就命名为jingdong了--懒得改代码名重新跑一遍结果了=.= 暴力法去做就是遍历每个点,判断它是不是"最大点".判断过程则是又遍历一遍,看看是否存在其他点在它右上方,若存在则不是最大点.O(N^2) 但是这样就会有很多不必要的计算,举个例子(这里暂且当坐标都是int),若存在一个最大点(x0,y0),那么所有在它左下角的点都不用考虑了. 另外,对于(x0,y0),只需要查找在它右边(x>x0)的点是

C语言笔试题精选1---求两个数之间较大的数,不使用if、while、switch、for、?:/以及任何比较语句

题目:求两个数a.b之间较大的数,不使用if.while.switch.for.?:/以及任何比较语句 #include <stdio.h> int min(int a, int b) { int d = a - b; int flag = ((unsigned int)d) >> 31; int array[] = {b, a}; return array[flag]; } int main(int argc, char *argv[]) { int i_min, a, b; s

Trie树/字典树题目(2017今日头条笔试题:异或)

1 /* 2 本程序说明: 3 4 [编程题] 异或 5 时间限制:1秒 6 空间限制:32768K 7 给定整数m以及n各数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大于m的有多少个. 8 输入描述: 9 第一行包含两个整数n,m. 10 11 第二行给出n个整数A1,A2,...,An. 12 13 数据范围 14 15 对于30%的数据,1 <= n, m <= 1000 16 17 对于100%的数据,1 <= n, m,

(笔试题)区间最大重叠

题目: 在一维坐标轴上有n个区间段,求重合区间最长的两个区间段. 区间段的数据结构定义如下: struct Interval{ int start; int end; }; 思路: 首先按照区间的左端点即start对n个区间段进行排序: 然后从前往后遍历所有区间,比较前后两个区间的右端点即end: 假设前后区间分别为[x1,y1],[x2,y2],因为是顺序遍历,因此x2>=x1,考虑一下情况: 如果y2>=y1, 则在[x2,y2]后面的区间和[x1,y1]的重叠部分不会超过这个区间,因为他