`
bolide74
  • 浏览: 84189 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

谷歌算法面试题,数学的威力!

阅读更多
引用
首先多谢评论中的几位高手提供的另外几种算法思路!我发出这个博文也就是想表达这么一个意思:不要把算法思维都禁锢在那么几种逻辑方法内,事实上还有其他很多各种奇思妙想的更有趣的算法,就比如这个用数学特性来解题的算法。

如果各位只纠结于这个算法有没有BUG、有没有局限性、效率是否达到最佳,那么我只能说很遗憾,各位没有体会到我的目的。

我的目的只有一个:条条大路通罗马,不要禁锢自己的思想,我们的算法其实可以更有趣,享受编程吧!



假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些。从算法是讲,什么方法能最快的查出所有小字符串里的字母在大字符串里都有?

比如,如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPOM
答案是true,所有在string2里的字母string1也都有。
如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPOZ
答案是false,因为第二个字符串里的Z字母不在第一个字符串里。

这个算法题是我在外刊IT评论里看到的,本来题目没有什么出奇的地方,按照我的思路,也只能想到说用HashMap来查找,能实现最小的时间复杂度。
但是这篇文章里的某个面试官的算法,却让我眼前一亮,他用的是数学方法:
引用
他走到白板前,”如果这样呢 —— 假设我们有一个一定个数的字母组成字串 —— 我给每个字母分配一个素数,从2开始,往后类推。这样A将会是2,B将会是3,C将会是5,等等。现在我遍历第一个字串,把每个字母代表的素数相乘。你最终会得到一个很大的整数,对吧?然后 —— 轮询第二个字符串,用每个字母除它。如果除的结果有余数,这说明有不匹配的字母。如果整个过程中没有余数,你应该知道它是第一个字串恰好的子集了。这样不行吗?“


看到这个算法,我想大部分人都会产生“居然还能这么干”的想法吧!
我刚刚把这个算法用java简单实现了一下,当然只是提供思路,BUG是肯定有的,局限性也肯定是有的,不过用来看看算法的思考方向还是足够了:
package com.iteye.bolide74.tester;

public class Tester {
	public static void main(String[] args) {
		int[] prime = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,
				53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103 };
		String strA = "ABCDEFGHIJKLMNO";
		String strB = "AFGHIJX";
		int strAlength = strA.length(), strBlength = strB.length();
		long strA2primes = 1, strB2primes = 1;
		for (int i = 0; i < strAlength; i++) {
			strA2primes *= prime[(strA.charAt(i) - 'A')];
			if (i < strBlength) {
				strB2primes *= prime[(strB.charAt(i) - 'A')];
			}
		}
		System.out.println(strA2primes % strB2primes == 0);
	}
}


引用
(在这些陈年旧账里发现的一点技术瑕疵:字母有可能重复而字符串可能会很长,所以必须要有统计。用那个最幼稚的解决方案时,当在大字符串里找到一个字符后就把它删掉,当这样仍然是 O(n*m)次。在Hashtable里我们会有一个key->value的计数。Guy的方案在这种情况下仍然好用。)


引用自“一次谷歌面试趣事”:
http://www.aqee.net/2011/04/11/google-interviewing-story/







7
8
分享到:
评论
14 楼 C.T 2011-04-29  
如果各位只纠结于这个算法有没有BUG、有没有局限性、效率是否达到最佳,那么我只能说很遗憾,各位没有体会到我的目的。

大家思考的时候都是从自身的方向出发的,不能理解你的感受很正常。大家看的方向不一样,风景不一样。
13 楼 sweat89 2011-04-19  
呵呵 有点意思····
12 楼 darren_nizna 2011-04-17  
这个算法局限性很大,字符串长了就得用大数。
11 楼 cq062364 2011-04-14  
我觉得用位图比较好,反正就26个字母,位图的大小就26,用大字符串建立位图,然后再位图中搜索小字符串中的每个字符。
10 楼 bolide74 2011-04-13  
回各位同学的各种问题:

首先多谢以上几位高手提供的另外几种算法思路!我发出这个博文也就是想表达这么一个意思:不要把算法思维都禁锢在那么几种逻辑方法内,事实上还有其他很多各种奇思妙想的更有趣的算法,就比如这个用数学特性来解题的算法。

如果各位只纠结于这个算法有没有BUG、有没有局限性、效率是否达到最佳,那么我只能说很遗憾,各位没有体会到我的目的。

我的目的只有一个:条条大路通罗马,不要禁锢自己的思想,我们的算法其实可以更有趣,享受编程吧!
9 楼 william_ai 2011-04-13  
a="ABCDEFGHIJKLMNO"  
b="AFGHIJX"  
  
ra=0  
for c in a:  
    ra|=2**(ord(c)-65)  
rb=0  
for c in b:  
    rb|=2**(ord(c)-65)  
  
r = ra|rb==ra  
print r 
8 楼 william_ai 2011-04-13  
有几个不懂的地方:

26个字母的话,用2到101的素数就ok了。103,不知道用来做什么的?

还有为什么不用两个循环来做?
if (i < strBlength) {
执行strAlength 次,执行strBlength次就ok了。

用bitmap的话是否更快些呢?
a="ABCDEFGHIJKLMNO"
b="AFGHIJX"

ra=0
for c in a:
	ra+=2**(ord(c)-65)
rb=0
for c in b:
	rb+=2**(ord(c)-65)

r = ra|rb==ra
print r
7 楼 liuyong1987 2011-04-13  
如果是这样的话,为什么不用移位来做?int[] prime = { 1, 2, 4, 8, 16,32 ... };  不是更快吗?
6 楼 liuxuejin 2011-04-13  
个人感觉,如果按照上题,bitmap更好,再说了他说的字符串。又不是只有英文字符,或许还有奇它的字符呢?例如中文?所以还是hashmap通用一点,大整数还有溢出的可能,int装不下,字符串一长,溢出很有可能!
5 楼 napoleonshow 2011-04-13  
gltop 写道
我觉得这样也可以:给两个CharSetA, CharSetB变量并赋值为0(如果都是大写字母或者不区分大小写32bit就够了),每个位对应着一个字母的索引(例如,字母A=0...Z=26)。逐个遍历两个字符串的字符,将其下标(如用当前字符-'A')的值对应的CharSet中的数和1做逻辑或运算。
最后判断(CharSetA | CharSetB)是不是==(CharSetA),等于就返回True,不等于返回False.

很好!!
4 楼 evanzzy 2011-04-12  
这篇外刊评伦我也看了,这个素数算法本身并不优秀,只不过提供了一种思路而已。我倒是认为把字母放在bitmap里面效率要高。用普通的hashset算法其实也不错,简单易懂。
3 楼 gltop 2011-04-12  
gltop 写道
我觉得这样也可以:给两个CharSetA, CharSetB变量并赋值为0(如果都是大写字母或者不区分大小写32bit就够了),每个位对应着一个字母的索引(例如,字母A=0...Z=26)。逐个遍历两个字符串的字符,将其下标(如用当前字符-'A')的值对应的CharSet中的数和1做逻辑或运算。
最后判断(CharSetA | CharSetB)是不是==(CharSetA),等于就返回True,不等于返回False.

- http://www.gltop.com
2 楼 gltop 2011-04-12  
我觉得这样也可以:给两个CharSetA, CharSetB变量并赋值为0(如果都是大写字母或者不区分大小写32bit就够了),每个位对应着一个字母的索引(例如,字母A=0...Z=26)。逐个遍历两个字符串的字符,将其下标(如用当前字符-'A')的值对应的CharSet中的数和1做逻辑或运算。
最后判断(CharSetA | CharSetB)是不是==(CharSetA),等于就返回True,不等于返回False.
1 楼 刀枪剑戟 2011-04-12  
别的不多说了,很给力!

相关推荐

    google面试题题及数学趣题

    标题《Google面试题及数学趣题》涉及的内容主要涵盖了两大部分:Google的面试题目分析以及一些锻炼思维能力的数学趣题。Google面试题作为IT行业求职者关注的焦点,它们不仅是面试的门槛,更被视为衡量应聘者技术水平...

    程序员面试题精选 C++ 算法 微软 google

    程序员面试题精选 C++ 算法 微软 google 程序员面试题精选 C++ 算法 微软 google

    GOOGLE面试题集锦

    Google 面试题集锦就是一个集合了 Google 面试题的资源,涵盖了逻辑、数学、算法等多个方面的知识点。 在硅谷高科技公司的面试中,经常会出现一些经典的面试题,这些问题的目的是考察应聘者的思维能力、逻辑思维...

    精选数据结构+算法 (加微软谷歌等IT经典面试题)

    这些文档和PDF,如"22道数据结构算法面试题.doc"、"算法大全-面试题-链表-栈-二叉树-数据结构.docx"等,提供了丰富的编程题目,帮助准备面试者巩固理论知识,提升实际编程技能。通过解答这些题目,可以更好地理解和...

    微软 腾讯 百度 谷歌 新浪 算法面试题集锦

    这些题目涵盖了广泛的计算机科学与软件工程知识,主要涉及算法、数据结构、字符串处理、数学问题以及逻辑推理。下面是根据题目内容解析的相关知识点: 1. **数组操作与最优化**: - 第一题要求找到数组中两两元素...

    算法面试题

    【算法面试题】是谷歌(Google)在招聘过程中经常使用的面试题目类型,旨在考察候选人的逻辑思维、问题解决能力和算法基础。以下是对这些面试题目的详细解析: 1. **生成随机整数**:给定一个能生成1到5的随机数函数...

    微软面试题解答google微软等大公司面试题

    微软公司面试人员的面试题解答,google微软等大公司面试题,软件架构师的设计。

    BAT谷歌微软等各IT公司互联网C++ JAVA 计算机笔试面试真题复习资料108个文档合集.zip

    C++基础面试题.docx C++开发工程师面试题库.docx C++技能测试试卷一及答案.docx C++技能测试试卷二及答案.docx c++笔试题汇总.pdf C++经典面试题库 附带参考答案.docx C++语言程序设计试题.docx C++面试题笔试题 CC+...

    11谷歌面试题精讲

    11谷歌面试题精讲

    google面试题google面试题

    - **遗传算法(Genetic Algorithms, GA)**: 一种模拟自然界生物进化过程的搜索优化算法。它通过编码、选择、交叉和变异等操作来寻找最优解。 - **模式分类**: 指将对象或数据点分配到预定义类别或类别的任务。 ###...

    google(谷歌)笔试面试题

    根据给定文件的信息,我们可以提炼出一系列与Google(谷歌)笔试面试相关的知识点,涉及编程、算法、计算机系统原理等多个方面。 ### 1. 递归函数的理解与应用 #### 标题:`int cal(int x)` 函数分析 **描述**: ...

    百度、谷歌、腾讯、微软数据结构算法面试题

    以上内容只是对题目中涉及知识点的初步解析,实际的面试题可能需要更深入的解答,包括具体算法的实现细节、复杂度分析、最优解策略等。对于IT行业的求职者,扎实的数据结构和算法基础至关重要,这直接影响到他们在...

    算法面试专题课(Java版),Google面试官带你高质量刷题.rar

    算法面试专题课(Java版),Google面试官带你高质量刷题视频教程,2021最新,本套课程不讲算法基础知识,专攻算法题解。讲师作为诸多算法练习相关网站出题人,拥有多年出题及面试经验,将大厂主流经典的面试题全面归类...

    算法面试专题课(Java版),Google面试官带你高质量刷题视频教程

    "算法面试专题课(Java版),Google面试官带你高质量刷题视频教程"提供了一种高效的学习方式,旨在帮助求职者提升自己的算法水平,更好地应对包括Google在内的顶级科技公司的面试挑战。 本课程主要涵盖了以下几个方面...

    mit 教授整理的google 面试题

    【谷歌面试题解析】 在科技巨头谷歌的面试过程中,算法和数据结构的掌握是至关重要的。这份由MIT(麻省理工学院)教授整理的资料,旨在帮助求职者充分准备谷歌的面试挑战。以下是对其中核心知识点的详细解读。 1. ...

    一线互联网大厂算法面试问题Java实现

    "一线互联网大厂算法面试问题Java实现"这个压缩包文件集合了多个知名公司的算法面试题目的Java实现,包括谷歌、亚马逊、领英、雅虎、微软、Facebook以及Airbnb等。这些题目覆盖了数据结构、排序、搜索、图论等多个...

    最新微软谷歌Google面试题怪题

    【微软和谷歌面试题解析】 微软和谷歌等顶级科技公司的面试题目往往别具一格,旨在测试应聘者的逻辑思维、创新能力和快速反应能力。这些题目并非寻找标准答案,而是评估应聘者的思维方式和解决问题的策略。 1. **...

    Google经典面试21题

    根据给定的信息,我们可以将这些经典的Google面试题分解为几个主要的知识点进行详细的解析: ### 1. 解密等式问题 **知识点:** - 数学逻辑与代数方程求解 - 字符串处理与算法设计 **解析:** 这道题目要求解一个...

    google公司笔试面试题合集

    以下是对"google公司笔试面试题合集"中可能包含的知识点的详细解析: 1. **算法与数据结构**: - 面试中常见的算法题包括排序(快速排序、归并排序、堆排序等)、查找(二分查找、哈希表查找)、图论(最短路径、...

    互联网行业面试笔试真题资料BAT谷歌微软等笔试面试真题复习资料合集200MB.zip

    C++基础面试题.docx C++开发工程师面试题库.docx C++技能测试试卷一及答案.docx C++技能测试试卷二及答案.docx c++笔试题汇总.pdf C++经典面试题库 附带参考答案.docx C++语言程序设计试题.docx C++面试题笔试题 CC+...

Global site tag (gtag.js) - Google Analytics