`

一道经典的Google算法题

阅读更多

      这是一道google的比较经典算法题,题目是:已经两个已经排好序的数组,找出两个数组合起来的中间大的数字。要求算法复杂度尽可能低。如:x数组:1,7,9,10,30    y数组:3,5,8,11    则中间大数为:8

 

     下面是我自己想的算法。 

 

public class GetMiddleValue 
{
	public static void main(String[] args)
	{
		int[] a = {1, 7, 9, 10, 30};
		int[] b = {3, 5, 8, 11};
		
		getMiddleValue(a, b);
		
		getMiddleValue2(a, b);
	}
	
	public static void getMiddleValue(int[] a, int[] b)
	{
		int n = (a.length + b.length + 1)/2;
		
		int i = 0;
		int j = 0;
		int sum = 0;
		int middle = 0;
		boolean flag = true;
		
		while(i < a.length && j < b.length)
		{
			if(a[i] <= b[j])
			{
				i++;
				middle = a[i-1];
			}
			else
			{
				j++;
				middle = b[j-1];
			}
			
			sum++;
			if(sum == n)
			{
				System.out.println("The middle number is : " + middle);
				
				flag = false;
				break;
			}
		}
		
		if(flag)
		{
			if(i == a.length)
			{
				while(sum < n)
				{
					j++;
					sum++;
				}
					
				middle = b[j-1];
			}
			else
			{
				while(sum < n)
				{
					i++;
					sum++;
				}
				
				middle = a[i-1];
			}
			
			System.out.println("The middle number is : " + middle);
		}
	}
	
	public static void getMiddleValue2(int[] a, int[] b)
	{
		int n = (a.length + b.length + 1)/2;
		
		int i = 0;
		int j = 0;
		int middle = 0;
		
		while(i < a.length && j < b.length && n > 0)
		{
			if(a[i] <= b[j])
			{
				i++;
				middle = a[i-1];
			}
			else
			{
				j++;
				middle = b[j-1];
			}
			
			n--;
		}
		
		if(n == 0)
		{
			System.out.println("The middle number is : " + middle);
		}
		else
		{
			if(i == a.length)
			{
				while(n > 0)
				{
					j++;
					n--;
				}
					
				middle = b[j-1];
			}
			else
			{
				while(n > 0)
				{
					i++;
					n--;
				}
				
				middle = a[i-1];
			}
			
			System.out.println("The middle number is : " + middle);		}
	}
}

//算法说明
//若两个数组合并起来有奇数个数,如9个, 则第5个为中间那个数
//若两个数组合并起来有偶数个数,如10个,则第5个为中间那个数

 

1
2
分享到:
评论
5 楼 蔡华江 2010-09-19  
楼主的思路算法应该是最优的,就是怎么写的这么臃肿,还可以优化 
4 楼 tangchj 2010-04-22  
这是我写的算法,看符不符合楼主要求,时间复杂度两数组长度之和
public class Test {

//这是一道google的比较经典算法题,题目是:已经两个已经排好序的数组,
//找出两个数组合起来的中间大的数字。要求算法复杂度尽可能低。
//如:x数组:1,7,9,10,30    y数组:3,5,8,11    则中间大数为:8
//算法说明  
//若两个数组合并起来有奇数个数,如9个, 则第5个为中间那个数  
//若两个数组合并起来有偶数个数,如10个,则第5个为中间那个数 
public static void main(String[] args) {
//int[] a = {1,7,9,10,30};
//int[] b = {3,5,8,11};
// int[] a = {1,2,3};
// int[] b = {4,5,6,7};
int[] a = {1,3,8};
int[] b = {4,5,6,7};
int[] c = new int[a.length+b.length];
int p1 = 0;
int p2 = 0;
for(int i=0;i<a.length+b.length;i++){
if(p1==a.length&&p2<b.length){
while(p2<b.length){
c[i] = b[p2];
i++;
p2++;
}
break;
}
if(p1<a.length&&p2==b.length){
while(p1<a.length){
c[i] = a[p1];
i++;
p1++;
}
break;
}
if(p1>=a.length&&p2>=b.length){
break;
}
if(a[p1]<=b[p2]){
c[i] = a[p1];
p1++;
}else{
c[i] = b[p2];
p2++;
}
}
for(int i=0;i<c.length;i++){
System.out.println(c[i]+",");
}
System.out.println("中间数:"+c[(c.length-1)/2]);
}

}
3 楼 jasstion 2009-09-24  
seasun 写道
我的想法是这样的,先得出第一组的中间数,然后再同第二组的数据对比大小

请问有官方答案吗?

你的想法可定不对,第一组的中间数不一定是组合后数据的中间数,你直接在申明一个数据能够存储两个数组,然后对其排序后,不久很容易得到中间的较大的数拉么?
2 楼 yoyo08 2009-07-06  
seasun 写道

我的想法是这样的,先得出第一组的中间数,然后再同第二组的数据对比大小 请问有官方答案吗?

官方答案不知道 你的想法具体怎么样?
假如A={1,2,3},B={4,5,6,7},怎么比较?
或者A={1,3,8},B={4,5,6,7},又怎么比较?
1 楼 seasun 2009-07-06  
我的想法是这样的,先得出第一组的中间数,然后再同第二组的数据对比大小

请问有官方答案吗?

相关推荐

    AB序列 O(N^2)实现 算法题

    AB序列,是一道经典的算法题。可以google搜索“AB”序列。 这儿是Java实现代码

    一道 Google 竞赛题的解法

    一道 Google 竞赛题的解法

    Google 算法真题 20201

    2. 一个 string S, 砍成两段,问有多少种存在的方式使得这两段 string 中的 number of 3. 一道 DP 在棋盘里面分蛋糕问题 4.

    google百度北电华为腾讯试题及面试

    算法题: 1.连接两个单向链表,返回排序后的结果。 2.一个保存有10000个URL的文本文件,删除其中相同的URL。 3.将9个石子放在9x9的方格中,要求同行、同列、45度上无两个石子。 智力题: 。。。。。 网易笔试...

    程序员面试金典-卷二

    应对棘手算法题的5种行之有效的方法通过这5种方法,你可以学会如何处理并攻克算法难题,包括那些最棘手的算法题。面试者最容易犯的10个错误不要因为这些常见的错误而与成功失之交臂。要了解面试者常犯的一些错误,...

    LeetCode,算法大佬总结,知识点加例题

    在这里推荐一个谷歌大佬的刷题笔记,每一道题的题解都写得非常清楚。作者在美国卡内基梅隆大学攻读硕士学位时,为了准备实习秋招,他从夏天开始整理 Leetcode 上的题目,几个月的时间,刷了几百道题目。 凭借着扎实...

    java_leetcode:java_leetcode 项目主要使用 java 刷 leetcode 的算法题,并作整理与总结

    java_leetcodeLeetCode 成为 Google 筛选码工的重要途径之一,可见 LeetCode 上面的题的重要性,因此开个项目,每周来刷一道题。通过刷题,更好的学习算法。算法算法对于我们的逻辑思维的锻炼是非常重要的,虽然知道...

    程序员面试金典-卷一

    应对棘手算法题的5种行之有效的方法通过这5种方法,你可以学会如何处理并攻克算法难题,包括那些最棘手的算法题。面试者最容易犯的10个错误不要因为这些常见的错误而与成功失之交臂。要了解面试者常犯的一些错误,...

    leetcode中国-leetcode:一起学习算法

    leetcode中国 home comment heroImage footer true false /favicon.png ...算法是很重要的基础素质,而且也能保持你的思维状态。可能你在工作中,很多业务,很难用得上算法。...每一道题,你不看题解完全独立做

    程序员面试金典 第5版

    本书是原谷歌资深面试...第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。

    程序员面试金典(第5版).rar

    本书是原谷歌资深面试...第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。

    Cracking the Coding Interview 6th Edition

    亚马逊超级畅销书,...第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。

    程序员面试金典 第五版 带书签目录

    第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。 本书适合程序开发和...

    程序员面试金典-第五版

    第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。 本书适合程序开发和...

    程序员面试金典-5版

    第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。 本书适合程序开发和...

    leetcode知乎-lc_books:从Leetcode、CodingInterviews等中精心挑选的算法问题的解决方案,由Java解决

    之前做题,几乎只能去参考Leetcode里面Discussion的解法和Google别人的解法,一道题当时做完觉得没什么貌似是理解了,但是等一段时间再次碰到,又不知道如何下手,这就是典型的没有理解和掌握透。所以在这里,我们...

    最大对称字符串的算法

    题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。

    课外研修报告

    由于研修过程中要准备数学建模国赛,故本次研修的主要结果是国赛前的一道练习题及其解答过程。主要内容如下: 1) 学会查资料。学会使用学校图书馆的数据库,谷歌高级搜索,来查找文献资料。 2) 去图书馆借书,书本...

    front-end-interview:前端面试问题汇总

    front-end-interview 前端面试问题汇总 本面试问题由汇总 Github开源面试问题 ...由一道题完善自己的前端知识体系! 笔试刷题·推荐网站 牛客网-专业IT笔试面试备考 LeetCode - The World's Leading Onlin

    Astro Bot | 谷歌(Chrome)浏览器插件

    可以在新标签页, 展示一道与程序相关的问题或相关新闻。涵盖了不同的编程语言, 算法, 数据结构等 【插件相关文章】 Astro Bot 用新标签页刷编程题 【插件开发者】 @jordan.evan.campbell 【插件更新】 ...

Global site tag (gtag.js) - Google Analytics