`

一道阿里电话面试中的算法题

阅读更多

 

电话面试算法题一道:找出数组中重复次数最多的元素并打印

 

问题不难,看你能给出更优的方案

 

 

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import commons.algorithm.sort.QuickSort;

/**
 * 找出数组中重复次数最多的元素并打印
 *
 */
public class Problem_3 {
	
	//先快速排序后循环查找    O( n*log2(n) + n )
	public static void find1(int[] arr){
		
		QuickSort.sort(arr);
		
		
		int max = arr[0];
		int pre=1;
		int now=1;
		
		for(int i=0;i<(arr.length-1);i++){
			
			if(arr[i]==arr[i+1])
				now++;
			else {
				if(now>=pre){
					pre=now;
					now=1;
					max=arr[i];
				}	
			}
		}
		
		
		
	}
	
	//嵌套循环查找   O(n*n)
	public static void find2(int[] arr){
		

		int pre=0;
		int max=arr[0];
		
		for(int i=0;i<arr.length;i++){
			int now=0;
			for(int j=0;j<arr.length;j++){
				
				if(arr[i]==arr[j]) {
					now++;	
				}				
			}
			
			if(now>=pre){			
				max=arr[i];
				pre=now;			
			}
			
					
		}
		
	
		
	}
	
	//通过 Hash 方式
	public static void find3(int[] arr){
		HashMap<Integer,Integer> hm=new HashMap<Integer, Integer>();
		for(int i=0;i<arr.length;i++){
			if(hm.containsKey(arr[i])) {
				int count=hm.get(arr[i]);
				hm.put(arr[i], ++count);
			 
			}else{
				hm.put(arr[i],1);
			}
		}
		
		Iterator<Entry<Integer, Integer>> it=hm.entrySet().iterator();
		int pre=0;
		int max=arr[0];
		while(it.hasNext()) {
			Entry<Integer, Integer> en=it.next();
			int key=en.getKey();
			int val=en.getValue();
			if(val>pre){	
				pre=val;
				max=key;
			}
			
		}
		
	
		
	}
	public static  void main(String args[]){

		//数据量800 重复元素多,查找时候分别是:  46  3680  195
		int arr2[]={0,1,2,        .....       
				,0,1,2,3,6,7,8,9};
		
		//数据量800 重复元素少,查找时间分别是     82  3727  360
		int arr[]={0,0,0,11,12,13,14,5,6    ......     
		                ,51,52,53,,728,29,730,731,3,794,95,796,797,798,799};
		

		
		long start,end;
			
		start=System.currentTimeMillis();
		for(int i=0;i<1000;i++) find1(arr);
		end=System.currentTimeMillis();
		System.out.println(end-start);
		
		start=System.currentTimeMillis();
		for(int i=0;i<1000;i++) find2(arr);
		end=System.currentTimeMillis();
		System.out.println(end-start);
		
		
		start=System.currentTimeMillis();
		for(int i=0;i<1000;i++) find3(arr);
		end=System.currentTimeMillis();
		System.out.println(end-start);
		
	}
}
 
分享到:
评论
30 楼 sunhj000java 2010-10-07  
我认为这道题的关键是如何遍历这个数据集合,如果能不用遍历集合而找出出现最多的次数的数字是这道题的关键。
我们可以用hashmap保存数据出现的个数,并且用两个变量保存出现最多的次数(max1)和次多的次数(max2),当剩下的数据个数小于max1-max2,那么我们就找出了这个数字了。
最优为n/2  最差为n
29 楼 worldwalk 2010-10-07  
xjwm 写道
只想问一句, 在项目里面会用到吗?

我倒是感觉笔试面试的题目项目中不会怎么用到,做项目和考试不是一个思路。 所以面试前要多做一些类似的题目,熟悉一下思路
28 楼 zhzhwe 2010-10-07  
int arr[] = { 1, 2, 5, 5, 6, 6, 9, 5, 3, 3, 4, 4, 4, 4, 5, 2, 2, 2, 2,
2, 7, 7, 7, 7, 7, 7 };
//定义MAP KEY表示存放的数字,VALUES表示出现的次数
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int n : arr) {
if (map.containsKey(n)) {
map.put(n, map.get(n) + 1);
} else {
map.put(n, 1);
}
}
//遍厉MAP
for (Map.Entry<Integer, Integer> m : map.entrySet()) { 
System.out.println(m.getKey() + " 出现了 " + m.getValue() + " 次.");  
   } 
}
27 楼 xiaoyao312 2010-10-07  
电话考察,那可得有足够编程经验和灵活的编程思想才能应付的了啊!
26 楼 0704681032 2010-10-07  
iamlotus 写道
用Hash的各位算过Hash的开销没有?不能光考虑时间复杂度,还要考虑空间复杂度。如果没有更多附加空间怎么办?
既然是电面,首先问明白限制条件,数据量是多大,K/M/G/T?重复数据占比?有没有附加空间/时间要求?
数据量K,随便怎么搞。
数据量M,QuickSort
数据量G,MergeSort了,因为内存不够要用IO
数据量T,MapReduce,否则单机处理不过来

重复数据非常多,考虑用Hash {data->repeatCount},以空间换时间
重复数据少,还是老老实实排序吧,Hash的空间开销蛮大的,而且resize相当慢。

复杂度分析来说,每个数据至少访问一遍,不可能有比O(n)更好的,这就是个考实现的题。既然是实现,当然要搞清楚环境,哪有闷着头写程序的道理。



说的很有道理...
25 楼 东四环屠夫 2010-10-06  
笔试题都犯不着搞这么长的答案。。 用 HashMap 即可。

电话面试主要是看你能不能干活,问点基础而已,至少基本库要知道吧。
24 楼 grayhound 2010-10-06  
楼上的各位有没有想过map.get()方法的时间复杂度?
23 楼 xjwm 2010-10-06  
只想问一句, 在项目里面会用到吗?
22 楼 笑我痴狂 2010-10-06  
首先要看  数组是不是已经排好序的 

如果是没有排序的   要想想要不要排好序后再去查找

方案一:没有排序的数组 ,用hashMap去存储,key是数组元素,value是出现的次数

方案二:如果是有序数组 , 只记录当前出现次数最多的数组值 , 每次去遍历下一个数组值的时候,直接跳过n个(n就是当前出现次数最多的次数),因为是排好序的, 所以在检测下一个值时,先记录下要检测的这个值,然后向后跳跃n-1个,如果跳跃之后的这个值跟你之前记录下的值比较不想等,就说明跳跃过的这几个值中间不可能出现比当前出现次数最多的值还多,这样算下了  时间复杂度就小于O(n) 
21 楼 gundumw100 2010-10-06  
貌似可以采用如下算法,我只是猜想,楼主不妨改改试试。
/**
      * 统计字符出现次数
      * @param s
      */ 
public Map<Character, Integer> getStatistics(String s) {   
        Map<Character, Integer> map = new HashMap<Character, Integer>();   
        int i, size = s.length();   
        for (i = 0; i < size; i++) {   
           char c = s.charAt(i);   
           map.put(c, map.containsKey(c) ? ((Integer) map.get(c) + 1) : 1);   
        }   
              return map; 
20 楼 InsonSiu 2010-10-06  
学习了,在没有看到回复前,我应该会用两个数组去比较,但现在觉得terencewong的方法会更好。
19 楼 flyingpig4 2010-10-06  
iamlotus的说法很有见解
18 楼 iamlotus 2010-10-06  
用Hash的各位算过Hash的开销没有?不能光考虑时间复杂度,还要考虑空间复杂度。如果没有更多附加空间怎么办?
既然是电面,首先问明白限制条件,数据量是多大,K/M/G/T?重复数据占比?有没有附加空间/时间要求?
数据量K,随便怎么搞。
数据量M,QuickSort
数据量G,MergeSort了,因为内存不够要用IO
数据量T,MapReduce,否则单机处理不过来

重复数据非常多,考虑用Hash {data->repeatCount},以空间换时间
重复数据少,还是老老实实排序吧,Hash的空间开销蛮大的,而且resize相当慢。

复杂度分析来说,每个数据至少访问一遍,不可能有比O(n)更好的,这就是个考实现的题。既然是实现,当然要搞清楚环境,哪有闷着头写程序的道理。
17 楼 bao231 2010-10-06  
首先要搞清楚,面试考的是什么方面的?不要乱提意见

我感觉他的考查点位:循环一次就能找到最大的重复元素。



16 楼 gosin 2010-10-06  
用HashMap就行了。
15 楼 phyeas 2010-10-06  
LZ,要看你的测试数据量…这种题主要时间都花在查找上,hash方式的查找效率是很快的,而其他方式则会受到查找时间的限制
14 楼 phyeas 2010-10-06  
想到最小完美哈希函数,不过生成函数的效率不高…
13 楼 leves 2010-10-06  
<p>
</p>
<pre name="code" class="java">public static void find3(int[] arr){
HashMap&lt;Integer,Integer&gt; hm=new HashMap&lt;Integer, Integer&gt;();
for(int i=0;i&lt;arr.length;i++){
if(hm.containsKey(arr[i])) {
int count=hm.get(arr[i]);
hm.put(arr[i], ++count);

}else{
hm.put(arr[i],1);
}
}

Iterator&lt;Entry&lt;Integer, Integer&gt;&gt; it=hm.entrySet().iterator();
int pre=0;
int max=arr[0];
while(it.hasNext()) {
Entry&lt;Integer, Integer&gt; en=it.next();
int key=en.getKey();
int val=en.getValue();
if(val&gt;pre){
pre=val;
max=key;
}

}

//System.out.println(max);

}</pre>

<p> </p>
<p>用Hash的方式写的,为什么测试的时候速度上反而是最慢的</p>
12 楼 mr_kairy 2010-10-06  
早上刚写的一个。。。贴出来大家评下哈....
效率也不算很高,也就是选择排序的那个效率了。。
		/**
		 * 思路: 依次选择比较。。记录每个数比较过后重复的个数  记录在变量里面..
		 * 然后比较当前 这个数 重复的次数  是否 大于上一次重复的个数。。
		 * 
		 */
		 int arr[] ={1,2,5,5,6,6,9,5,3,3,4,4,4,4,5,2,2,2,2,2,7,7,7,7,7,7};
		 
		 int tempCount = 0;	//记录上个一个数 重复的个数
		 int reNumber[] = new int[50];		//重复需要打印的数
		 
		 //双循环 知道重复的个数...
		 for(int i=0;i<arr.length -1 ; i++){
			
			 int nowCount = 0 ;	//当前这个数 重复的个数
			 
			 for (int j = i+1; j < arr.length; j++) {
				//判断当前循环的数 是否有重复的
				 if(arr[i] == arr[j]){
					 nowCount++;
				 }
			 }
			 
			 //判断 当前 重复的数 是否 多于上一次重复的数
			 if(nowCount > tempCount){
				 tempCount = nowCount;
				 reNumber = new int[50];	//设置50个大小 装重复的数
			 }
			 
			 //如果有相同个数  重复的数
			 if(nowCount == tempCount){
				 for (int j = 0; j < reNumber.length; j++) {
					 if(reNumber[j] == 0){
						 reNumber[j] = arr[i];
						 break;
					 }
				 }
			 }
		 }
		 
		 //打印 
		 for (int i = 0; i < reNumber.length; i++) {
			if(reNumber[i] == 0){
				break;
			}else{
				System.out.println(reNumber[i]);
			}
		}

结果输出:2 , 7
11 楼 leves 2010-10-06  
icanfly 写道
codeparser 写道
terencewong 写道
you can consider hash. Key will be the value of the array element, and the duplicate time will be the value. The complexity will be O(n). Maybe you can do more research to make it in O(lgN).


应该是这个思路,因为它只要求记录最多的那个元素,可以在hash的时候,顺便记录下当前重复次数最多的元素。
有种情况是重复次数相同的时候,也需要记录下来,这样只需要扫描一遍数组就可以了。


有两个值有可能hash值一样,还得做一下判断!


在读的时候通过Hash的方式存,但读的时候呢?不是还需要循环比较 value的大小?


相关推荐

    高中数学如何解决阿里面试算法题

    今天跟大家分享一道阿里的算法面试题。 题目描述 给定一个正整数nnn,把它拆分为若干个数的和,记这若干个数的积为MMM,求MMM的最大值。 题目分析 这道题正常的思路是使用动态规划算法。 假设 dp[n]dp[n]dp[n] 为正...

    阿里技术《程序员面试宝典》

    这本书不仅提供了解题思路,还对每一道题目的不同解法进行了详尽的解析,有的题目甚至给出了多种解法,帮助读者开阔思维,理解算法的多样性。通过这些内容的学习,读者能够提升解决实际问题的能力,增加面试成功的...

    最新阿里算法(LeetCode)指南(文档和代码).zip

    5. 实战经验:分享阿里巴巴内部项目中的算法应用,以及面试过程中可能遇到的问题。 三、代码示例 配套的代码示例通常会以Python、Java、C++等主流编程语言编写,每个例子都会对应一个或多个LeetCode题目,旨在帮助...

    阿里各岗位技术面试题含答案最新.docx

    【阿里技术面试题解析】 ...以上是阿里集团不同职位的面试题解析,涉及了并发编程、网络编程、系统设计、数据结构、算法等多个领域的知识点。这些题目展示了阿里集团对于技术人才全面而深入的技术要求。

    选择文件 ( 阿里研发面试题2016最新.docx )

    总结起来,本文介绍了进程创建的基本概念,特别是`fork()`函数的工作方式,以及正则表达式的使用和匹配规则,同时涉及了一道逻辑推理题。对于研发面试来说,这些知识点涵盖了操作系统、编程基础和逻辑思维能力,都是...

    2023最新版大厂面试真题

    这份资料涵盖了百度、腾讯、阿里、华为、京东、美团、拼多多、携程、蚂蚁金服、唯品会、字节跳动、阿里云和哔哩哔哩(B站)等多家知名企业的面试题目。 首先,我们要明白这些大厂在面试时通常关注哪些方面: 1. ...

    阿里巴巴面试题leetcode-CharSimpleAlgorithm:字符串算法

    阿里巴巴面试题leetcode CharSimpleAlgorithm 字符串算法 WordConversion 该类是用于改变字母的大小写,使一...ps:该类的实际意义没有想到,是我在浏览LeetCode评论区的时候看到的一道阿里巴巴面试题,所以就实现了一下

    阿里巴巴笔试题打包

    5. 理解并认同阿里巴巴的企业文化,能够在面试中体现出自身价值观与企业文化的契合。 总之,要想在阿里巴巴的笔试中脱颖而出,就必须以全面的知识储备和充分的练习作为基础。无论对于在校学生还是社会人士,这都是...

    2012十月百度_阿里巴巴_迅雷_搜狗面试题

    这些面试题展示了面试者需要掌握的关键技能,包括但不限于算法分析、数据结构的应用、问题解决能力以及对基础理论的深入理解。在实际工作中,这些知识对于优化代码性能、解决复杂问题以及进行系统设计都至关重要。

    「面试算法练习等级攻略」-「LeetCode题解」-「剑指offer题解」_Java_下载.zip

    《面试算法练习等级攻略》- LeetCode 题解与《剑指Offer》题解 Java 版本 在准备IT行业的面试,特别是算法相关的职位时,LeetCode 和《剑指Offer》是两个不可或缺的资源。这份压缩包包含了这两个平台上的算法问题的...

    华为od社招python开发面试题.docx

    3. **算法题解答**:技术面试环节通常会有一道算法题,需在规定时间内完成。 - 建议策略:先快速理解题目要求,再构思解题思路,最后编码实现。 4. **沟通技巧**: - 在面试过程中保持自信,即使遇到不懂的问题也...

    阿里巴巴_java_研发成功笔面试总结.doc

    在职业发展的道路上,技术研发岗位的笔面试无疑是一道难关。对于许多技术研发者来说,能否在激烈的竞争中脱颖而出,往往取决于个人在笔面试中的表现。今天,我们分享的是一篇关于阿里巴巴Java研发岗位笔面试成功经验...

    阿里巴巴2014校园招聘笔试试题-软件研发工程+网友版答案.docx

    - 第19题:这是一道关于组合计数的问题,询问的是在一定条件下不同颜色球的组合数。 4. **系统负载与性能监控**: - 第22题:题目涉及系统负载的概念,指出了一分钟、五分钟和十五分钟的平均负载,负载越低说明...

    华为od社招python开发面试题.pdf

    3. **实战演练**:面试中可能会给出一道算法题供现场解答,通常时间为20分钟左右。 - **建议**:提前熟悉常见的数据结构与算法,提高解决问题的能力。 #### 六、综合建议 1. **技术积累**:不断学习新知识,提高...

    IT公司面试大全

    面试中,面试官通常会出一些算法题目,如排序、查找、图论、动态规划等。对于数据结构,链表、队列、栈、树、哈希表等的理解及其应用是考察的重点。熟练掌握这些基本功,能帮助你在解决问题时快速找到最优解。 六、...

    c++笔试题-多个大厂秋招笔试题库!

    本资源精心收录了多家知名企业(包括奇安信、贝壳找房、小米、游卡、vivo、阿里巴巴、爱奇艺、百度、猿辅导、中兴等)的C++方向笔试题,覆盖从2020年至2022年的秋招和校招题目。这些题目不仅考察了C++的基础知识,如...

    各个大的IT公司笔试真题汇总,值得一看.doc

    11. **面试经验**:除了笔试,如阿里巴巴的校园招聘试卷,也可能包含面试技巧和常见面试问题的讨论。 准备这些笔试的关键在于广泛学习和深入理解计算机科学的基本原理,同时保持对新技术的关注和实践。通过模拟题和...

    计算机学习经验谈

    - 谷歌等公司在面试时可能会考察系统设计能力和算法题解答能力。 3. **公司选择**: - 实习机会能够增加内部转正的可能性,因此选择一家理想的公司实习至关重要。 - 创业公司和大型企业各有优势,可根据个人职业...

    世界500强面试题.pdf

    第一篇 面试题 ................................................................................ 8 1.1. 简介 ................................................................................................

Global site tag (gtag.js) - Google Analytics