头条的笔试题

测试的原因只做了2道,都是一次过了,感觉是在考察数据结构,没有算法,数据结构用对了就是遍历一遍数出来。看懂数据结构了,就很简单了,贴出来分享下自己的想法。
串珠:
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<iterator>
using namespace std;

int main()
{
	int n, m, c;
	cin >> n >> m >> c;
	vector<set<int>>record(c+1);
	string temp;
	int num;
	int cx;
	for (int i = 0; i < n; i++)
	{
		cin >> num;
		for (int j = 0; j < num; j++)
		{
			cin >> cx;
			record[cx].insert(i);
		}
	}
	int result = 0;
	for (int i = 1; i < c+1; i++)
	{
		int last = 0;
		for (set<int>::iterator s = record[i].begin(); s != record[i].end();s++){
			if (s != record[i].begin() &&  (*s) - last <m)
			{
				result++;
				break;
			}
			last = *s;
		}
		if (record[i].size() >1 &&  (*(record[i].begin()) == 0) &&  last == n-1){
			result++;
		}
	}
	cout << result << endl;
	system("pause");
	return 0;
}
喜好的:
int main(){
	int n;
	map<int, set<int>> record;
	cin >> n;
	int tem;
	for (int i = 0; i < n; i++)
	{
		cin >> tem;
		record[tem].insert(i+1);
	}
	int q;
	cin >> q;
	vector<int>result(q);
	int l, r, k;
	int num = 0;
	for (int i = 0; i < q; i++)
	{
		cin >> l >> r >> k;
		num = 0;
		for (set<int>::iterator s = record[k].begin();s != record[k].end(); s++)
		{
			if ((*s) >= l && (*s) <= r){
				num++;
			}
		}
		result[i] = num;
	}
	for (int i = 0; i < q; i++)
	{
		cout << result[i] << endl;
	}
	return 0;
}

#字节跳动#
全部评论
能不能讲一下第一题思路啊
点赞 回复 分享
发布于 2017-09-10 23:38
 if (record[i].size() >1 &&  (*(record[i].begin()) == 0) &&  last == n-1){             result++;         } 这个判断条件不对吧
点赞 回复 分享
发布于 2017-09-11 11:10
    第一题没什么好说的。     第二题本人想到了2种方法(笔试中用第一种方法AC了)。         方法1:用map或者有序数列二分查询来将喜好程度离散化(离散化后每个喜好程度对应1~n的一个数),建立一个数组cnt,保存每个数出现的次数。         将问题按区间左界升序排序,则问题也一定是按区间右界升序的(题目中有说明)。对于每个问题,直接去cnt数组中查询可得到结果。         对于2个相邻的问题,设区间为[L1 , R1] 和[ L2 ,R2 ],则我们需要使cnt数组减去[ L1 ,L2 )区间内所有的喜好程度数量,加上( R1, R2]区间内所有的喜好程度数量。则下一个问题也直接能从cnt数组中查询。         结束之后,将所有的问题按提问顺序排序并输出。         总时间复杂度为O(nlogn+q)。                  方法2:建立一棵普通的线段树,线段树初始状态为全0。用来查询区间的数量总和。用将问题和用户都按喜好程度升序排序。对于一批喜好程度为k的问题,将所有喜好程度为k的用户,以权值1存入线段树,并用线段树得出这批问题的结果;然后将所有喜好程度为k的用户,以权值-1存入线段树(相当于删除原来对线段树的改动)此时线段树变成全0的初始状态,然后继续处理下一批。         结束之后,将所有的问题按提问顺序排序并输出。         由于每个元素仅有2次存入线段树的操作(权值分别为1和-1),每个问题q以logn的复杂度得到结果,再考虑排序耗费的时间,总时间复杂度为O((n+q)logn+qlogq)。         点评:方法1和方法2的复杂度均为nlogn级别的,在此题的数据量下并不会超时。方法1的实现更为简单,但其利用了题目中对与区间的限定,而方法2的实现稍为复杂,但并不需要题目的特殊约定。
点赞 回复 分享
发布于 2017-09-11 09:15
洋哥!
点赞 回复 分享
发布于 2017-09-11 09:10
凭啥啊,第二题代码和我那么像,为何我不通过
点赞 回复 分享
发布于 2017-09-11 02:14
好厉害
点赞 回复 分享
发布于 2017-09-11 00:03
我等学渣智能膜拜,只会暴力搜索的飘过~~~~~~~~~~~~~~
点赞 回复 分享
发布于 2017-09-10 23:46

相关推荐

点赞 评论 收藏
分享
机械打工仔:有说的你怀疑一下就行了,直接问也太实诚了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
08-19 15:42
可以可以真成路边一条了有实习
投递阿里巴巴集团等公司10个岗位
点赞 评论 收藏
分享
评论
4
13
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务