一道关于大数据面试题(1)

本文解析了一道大数据面试题,涉及十万随机数中寻找重复次数最多的数字,通过巧妙地使用四个小数组而非一个大数组,展示了如何在限制条件下高效解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      大数据时代来临,现在好多面试都有大数据题目,下面大家一起来看一道大数据题目吧

题:

       文件中产生100000 (十万)个随机数字,数字的取值范围0~32767 , 按如下要求实现,在实现过程中能够使用的数组最长为10000 ,个别变量的内存忽略。找到重复次数最多的那个数字(如果有多个,选择任意一 个)

       乍一看这个题我们可能这个数字庞大难以下手,这个题我的思路就是创建一个长度32767的数组,用数组下标保存出现的数字,用数组中每一个下标的所对应的元素保存该数字出现的次数,(大家有没有发现这个和我们前几天学的顺序表刚好相似)然后利用循环遍历数组来比较出现次数最多的那一个,但是题目中给我了限制数组长度为了10000,我们的32767的长度肯定无法创立,所以面对这种情况我们该怎么办呢?他不让我们建立大数组我们可以建立四个小数组,然后比较出四个中的最大就好了,还有一个问题就是我们应该如何验证我们所计算出来的数据呢?我们可以就建立一个大小32767的数组和那4个小数组的进行比较,如果我们的结果相同那就证明我们准确,下面我来给大家展示我谱写的代码

#include "stdio.h"
#include "stdio.h"
#include "stdlib.h"
#include "assert.h"

#define num 1000000

typedef struct Max
{
	int data;
	int times;
}Max;

void  file(char*path)//建立文件存放数据
{
	FILE *fw=fopen(path,"wb");//wb:打开或者新建一个二进制文件,只允许读;
	
	assert(fw!=NULL);
	int tmp;
	for(int i=0;i<num;i++)
	{
		tmp=rand();
		fwrite(&tmp,sizeof(int),1,fw);
	}
	fclose(fw);
}
Max verify(char*path)//使用一个大的的数组进行计算,为了和后面的四个数组的结果进行对比
{
	FILE *fr=fopen(path,"rb");//rb:用读写方式打开二进制文件;
	assert(fr!=NULL);

	int *arr=(int*)calloc(RAND_MAX+1,sizeof(int));//RAND_MAX是rand函数返回值刚好是32767,calloc动态数组置0;
	int tmp;
	Max a={0,0};
	while(fread(&tmp,sizeof(int),1,fr)>0)
	{
		arr[tmp]++;//动态数组arr下标保存数字,值代表出现次数;
	}
	for(int i=0;i<RAND_MAX+1;i++)
	{
		if(a.times<arr[i])
		{
			a.times=arr[i];
			a.data=i;
		}
	}
	fclose(fr);
	free(arr);
	return a;
}

Max part(char*path)
{
	int len=RAND_MAX/4+1;
	int *arr=(int*)calloc(len,sizeof(int));
	FILE *fr=fopen(path,"rb");
	
	assert(fr!=NULL);
	
	int tmp;
	Max b={0,0};
	while(fread(&tmp,sizeof(int),1,fr)>0)
	{
		arr[tmp/4]++;//避免数组越界所以/4
	}
	for(int i=0;i<len;i++)
	{
		if(b.times<arr[i])
		{
			b.data=i*4+i%4;//还原除4之前的数字
			b.times=arr[i];
		}
	}
		fclose(fr);
	    free(arr);
	    return b;
}
Max part2(char *path)
{
	char *path1 = "E:\\1.txt";//余数为0
	char *path2 = "E:\\2.txt";//余数为1
	char *path3 = "E:\\3.txt";//余数为2
	char *path4 = "E:\\4.txt";//余数为3
	FILE *fr = fopen(path,"rb");
	FILE *fw1 = fopen(path1,"wb");
	FILE *fw2 = fopen(path2,"wb");
	FILE *fw3 = fopen(path3,"wb");
	FILE *fw4 = fopen(path4,"wb");

	assert(fr!=NULL&&fw1!=NULL && fw2!=NULL && fw3!=NULL&&fw4!=NULL);
	
	int tmp;
	while(fread(&tmp,sizeof(int),1,fr) > 0)// 将原文件中的数据散列到4个不同的文件中
	{
		if(tmp%4==0) 
		{
			fwrite(&tmp,sizeof(int),1,fw1);
		}
		else if(tmp%4==1)
		{
			fwrite(&tmp,sizeof(int),1,fw2);
		}
		else if(tmp%4 == 2)
		{
			fwrite(&tmp,sizeof(int),1,fw3);
		}
		else
		{
			fwrite(&tmp,sizeof(int),1,fw4);
		}
	}

	Max arr[4];
	arr[0] = part(path1);
	arr[1] = part(path2);
	arr[2] = part(path3);
	arr[3] = part(path4);

	int max= 0;//保存次数最多的数据的下标
	for(int i=0;i<4;i++)
	{
		if(arr[max].times < arr[i].times)
		{
			max = i;
		}
	}
	fclose(fr);
	fclose(fw1);
	fclose(fw2);
	fclose(fw3);
	fclose(fw4);
	
	return arr[max];
}
int main()
{
	char *path = "E:\\big data.txt";
	file(path);
	Max tmp = verify(path);
	Max tmp2 =part2(path);
	printf("数字是=%d,出现次数=%d\n",tmp.data,tmp.times);
	printf("数字是=%d,出现次数=%d\n",tmp2.data,tmp2.times);

	return 0;
}

大家有没有觉得其实大数据题也就是纸老虎,就是看起来不好处理,其实也没那么困难(当然也有可能是我太聪明。)

 

 

引用:面试是双方相互了解的过程,所以出于礼貌在面试结束询问一下你有没有什么想问的。当然面试官也想借此了解你对他们公司的了解程度及感兴趣程度。引用:自我介绍写一个单例模式(整个过程挺让人不舒服的,一直在用训斥的语气说话)面试官口述一道题:两个自然数相加,这两个自然数可能会非常大(就是大数a b),体验也很差,我写完之后,因为没有测试用例(他口述的题目,没法提交验证),我就随便写了两个例子试了一下,他就说:你写这么多行代码,就用这么几个用例测试吗(训斥的口吻),最好还是提示了一下,后面的while循环没有测,反正最后是写出来了MySQL用过么,它的索引用什么结构实现的(B 树)B 树除了查询稳定,还有其他的优势吗(更适合范围查询)B和B 树的核心区别(答了非叶子节点的区别)怎么看一个SQL需要优化的地方场景图:给一道SQL,问怎么建索引,大概是:select orz,dt,ort from tb where dt >= '2021-10-03' and dt <= '2021-10-25' and/or ort in (4,5,6)ort的连接条件我记不清是and还是or了。我说建联合索引(dt和rt),他问谁在前谁在后,我说应该是dt吧(因为我真不会,我是感觉这俩前后是无所谓的),希望有大佬可以解答一下Java的动态代理(我只记得反射了)(总感觉自己在面后端,不是大数据)聊了一下最新的我在做的项目(给国能做的知识图谱的),聊了挺多的,这个时候气氛才拉回来经典反问。 引用:2、声明粒度 从关注原子粒度开始设计,也就是从最细粒度开始,因为原子粒度能够承受无法预期的用户查询。但是上卷汇总粒度对查询性能的提升很重要的,所以对于有明确需求的数据,我们建立针对需求的上卷汇总粒度,对需求不明朗的数据我们建立原子粒度。 根据提供的引用内容,美团大数据开发面试题主要包括以下几个方面: 1. 单例模式的实现:请写出一个单例模式的代码实现。 2. 大数相加:实现两个可能非常大的自然数相加的代码,注意考虑性能和测试用例。 3. MySQL索引:讨论MySQL索引的实现机制和优势,以及如何根据SQL语句建立索引。 4. Java动态代理:解释Java动态代理的概念和使用场景。 5. 项目经验:讨论面试者最新做的项目,例如知识图谱的开发经验。 6. 声明粒度:探讨数据设计中声明粒度的重要性和应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值