代码改变世界

随笔分类 -  数据结构和算法

求数n的最大素因子是第几个素数

2012-12-27 14:30 by coodoing, 1772 阅读, 收藏, 编辑
摘要: 问题描述每个数都可以分解成质因数的乘积。现在求一个数n的最大素因子是素数集合中的第几个素数。n小于1000000。解决方法利用筛选法获得,具体可见求质数算法的N种境界- 试除法和初级筛法。 图解说明如下:1、具体过程对于1000000内的数字而言,利用筛选法计算其中素数,并标记出每个素数对应的位置信息。利用prime数组保存范围内的素数;利用position数组保存每个数所对应的位置。 1: public static final int NUM = 1000001; // 100万个数 2: static int primeNum = 80000; // 根据素数定理估算得到 3... 阅读全文

大整数相关的几道题

2012-09-16 22:40 by coodoing, 796 阅读, 收藏, 编辑
摘要: 1、大整数相加 1: static void plus(String input1, String input2) { 2: char[] input11 = input1.toCharArray(); 3: char[] input21 = input2.toCharArray(); 4: ... 阅读全文

链表,栈,队列插入删除操作

2012-08-15 17:46 by coodoing, 4906 阅读, 收藏, 编辑
摘要: 本文主要对常见的几种数据结构的插入删除操作进行整理和说明,具体的可视化程序可参考这里。1、链表 1.1 单向链表插入结点:在指针p所指的结点后插入指针s所指的结点。(1)s->next = p->next;(2)p->next = s删除节点:删除指针p所指的结点的后继节点。p->next = p->next->next具体问题可以参考《编程之美》中的从无头单链表中删除节点问题。 1.2 双链式链表插入结点:指针p所指的结点前插入指针s所指的结点。(1) s->prior = p->prior;(2) p-> prior ->next 阅读全文

栈的push、pop序列-实现

2012-08-14 21:21 by coodoing, 3332 阅读, 收藏, 编辑
摘要: 1、问题描述 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。 比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,这样得到的pop序列就是4、5、3、2、1。但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。2、分析 这道题的一个很直观的想法就是建立一个辅助栈,每次pus 阅读全文

多个集合合并成没有交集的集合-实现

2012-08-14 17:50 by coodoing, 5145 阅读, 收藏, 编辑
摘要: 1、问题描述 将多个集合合并成没有交集的集合。 给定一个字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。 (1)请描述你解决这个问题的思路; (2)... 阅读全文

单链表是否有环和两个链表是否有公共节点问题

2012-08-14 16:40 by coodoing, 790 阅读, 收藏, 编辑
摘要: 1、单链表是否有环题目描述:有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。问题: 1、如何判断一个链表是不是这类链表? 2、如果链表为存在环,如何找到环的入口点?一、判断链表是否存在环 设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则为无环链表)。 1: boolean isExsitLoop() { 2: Node<T> slow ... 阅读全文

Mathematica's Google Aptitude

2012-08-14 00:16 by coodoing, 367 阅读, 收藏, 编辑
摘要: The Billboard So perhaps it's no great surprise that Google utilizes unusually mathematically oriented recruitment techniques. In fact, these practices have received widespread coverage in the last f... 阅读全文

【转】十月百度,阿里巴巴,迅雷搜狗最新面试七十题(第201-270题)

2012-08-13 15:36 by coodoing, 1291 阅读, 收藏, 编辑
摘要: 十月百度:一个数组保存了N个结构,每个结构保存了一个坐标,结构间的坐标都不相同,请问如何找到指定坐标的结构(除了遍历整个数组,是否有更好的办法)?(要么预先排序,二分查找。要么哈希。hash的话,坐标(x,y)你可以当做一个2位数,写一个哈希函数,把(x,y)直接转成“(x,y)”作为key,默认用string比较。或如Edward Lee所说,将坐标(x, y)作为 Hash 中的 key。例如(m, n),通过 (m,n) 和 (n, m) 两次查找看是否在 HashMap 中。也可以在保存时就规定 (x, y) , x < y ,在插入之前做个判断。)百度最新面试题:现在有1千万个 阅读全文

【转】微软、谷歌、百度等公司经典面试题[第101-160题]

2012-08-13 15:09 by coodoing, 580 阅读, 收藏, 编辑
摘要: 微软十五道面试题1、有一个整数数组,请求出两两之差绝对值最小的值, 记住,只要得出最小值即可,不需要求出是哪两个数。2、写一个函数,检查字符是否是整数,如果是,返回其整数值。 (或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)3、给出一个函数来输出一个字符串的所有排列。4、(a)请编写实现malloc()内存分配函数功能一样的代码。 (b)给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。5、怎样编写一个程序,把一个有序整数数组放到二叉树中?6、怎样从顶部开始逐层打印二叉树结点数据?请编程。 7、怎样把一个链表掉个顺序(也就是反序,注... 阅读全文

【转】微软等数据结构+算法面试100题全部答案集锦

2012-08-13 14:53 by coodoing, 1313 阅读, 收藏, 编辑
摘要: 1.把二元查找树转变成排序的双向链表。 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 首先我们定义的二元查找树节点的数据结构如下: struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child ... 阅读全文

google几道面试题

2012-08-13 13:03 by coodoing, 354 阅读, 收藏, 编辑
摘要: 1、找规律 1 1 1 2 1 1 2 1 1 1 1 1 2 2 1下一行是什么?2、 数列中下一个应该是: 10, 9, 60, 90, 70, 66, ?A) 96 B) 1000000000000000000000000000000000 0000000000000000000000000000000000 000000000000000000000000000000000 C) Either of the above D) None of the above3、有一个特殊的链表,其中每个节点不但有指向下一个节点的指... 阅读全文

百度面试题集锦

2012-08-12 22:08 by coodoing, 396 阅读, 收藏, 编辑
摘要: 1、实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去。 例子: func(7) = 4,可以证明最少需要4次运算 n = 7 n-1 6 n/2 3 n-1 2 n/2 1 要求:实现函数(实现尽可能高效) int func(unsign int n);n为输入,返回最小的运算次数。给出思路(文字描述),完成代码,并分析你算法的时间复杂度。 答: · int func(unsigned int n) · { ·... 阅读全文

最长递减子序列

2012-08-12 19:30 by coodoing, 2637 阅读, 收藏, 编辑
摘要: 问题描述求一个数组的最长递减子序列比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}。问题分析本问题类似编程之美中的求数组中最长递增子序列问题。可以利用动态规划方法解决。假设在目标数组array[]的前i个元素中,最长递减子序列的长度为LDS[i]。那么 LDS[i+1] = max{1,LDS[k]+1},其中array[i+1]<array[k],for any k<=i。即如果array[i+1]<array[k],那么第i+1个元素可以添加到LDS[k]长的子序列后构成一个更长的递减子序列。与此同时,array[i+1]可以由自身构造成一个 阅读全文

蓄水池抽样 - Reservoir Sampling

2012-08-10 17:08 by coodoing, 1030 阅读, 收藏, 编辑
摘要: 蓄水池抽样一般用于海量数据不知道总数只能遍历一次随机抽样问题。第一部分:问题描述 问题起源于编程珠玑Column 12中的题目10,其描述如下: How could you select one of n objects at random, where you see the objects sequentially but you do not know the value of n beforehand? For concreteness, how would you read a text file, and select and print one random line, whe. 阅读全文

【转】求质数算法的N种境界- 试除法和初级筛法

2012-08-10 12:49 by coodoing, 610 阅读, 收藏, 编辑
摘要: 转帖:http://program-think.blogspot.com/2011/12/prime-algorithm-1.html★引子 前天,俺在《俺的招聘经验[4]:通过笔试答题能看出啥?》一文,以"求质数"作为例子,介绍了一些考察应聘者的经验。由于本文没有政治敏感内容,顺便就转贴到俺在CSDN的镜像博客。 昨天,某个CSDN网友在留言中写道:老实说,这个程序并不好写,除非你背过这段代码 如果只在纸上让别人写程序,很多人都会出错 但是如果给一台电脑,大多数人都会把这个程序调试正确 出这个题目没啥意义 只能让别人觉得你出题水平低 首先,... 阅读全文

[续]全排列的非递归实现

2012-08-10 09:04 by coodoing, 883 阅读, 收藏, 编辑
摘要: 前文提到过全排列的递归实现,这里在简单的介绍下全排列的非递归实现。 以6个数字的全排列为例说明,相当于用1,2,3,4,5,6 构造一个六位数,每一位上取一个数,这样一共有6!中方法。 很显然,这6!个数是有大小的,如果按从小到大排列,示意如下: 1 2 3 4 5 6 1 2 3 4 6 5 1 2 3 5 4 6 ………… ... 阅读全文

【转】堆,栈区别

2012-08-09 17:12 by coodoing, 357 阅读, 收藏, 编辑
摘要: 非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥!第一部分:堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 : 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化... 阅读全文

尾递归

2012-08-09 16:19 by coodoing, 459 阅读, 收藏, 编辑
摘要: 在传统递归方法中,每次重复的过程调用都使得调用链条不断加长. 系统不得不使用栈进行数据保存和恢复。如果单项链表十分长,那么上面这个方法就可能会遇到栈溢出,也就是抛出StackOverflowException。这是由于每个线程在执行代码时,都会分配一定尺寸的栈空间(Windows系统中为1M),每次方法调用时都会在栈里储存一定信息(如参数、局部变量、返回地址等等),这些信息再少也会占用一定空间,成千上万个此类空间累积起来,自然就超过线程的栈空间了。而尾递归就不存在这样的问题。 尾递归相对传统递归,其是一种特例。在尾递归中,先执行某部分的计算,然后开始调用递归,所以你可以得到当前的计算结果,而. 阅读全文

【转】海量数据处理

2012-08-08 16:35 by coodoing, 795 阅读, 收藏, 编辑
摘要: 1、何谓海量数据处理? 所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存。 那解决办法呢?针对时间,我们可以采用巧妙的算法搭配合适的数据结构,如Bloom filter/Hash/bit-map/堆/数据库或倒排索引/trie树,针对空间,无非就一个办法:大而化小:分而治之/hash映射,你不是说规模太大嘛,那简单啊,就把规模大化为规模小的,各个击破不就完了嘛。 至于所谓的单机及集群问题,通俗点来讲,单机就是处理装载数据的机器有限(只要考虑cpu,内存,硬盘的数据交互),而集群, 阅读全文

【转】从Trie树(字典树)谈到后缀树

2012-08-08 16:33 by coodoing, 967 阅读, 收藏, 编辑
摘要: 本文第一部分,咱们就来了解这个Trie树,然后自然而然过渡到第二部分、后缀树,接着进入第三部分、详细阐述后缀树的构造方法-Ukkonen。第一部分、Trie树1.1、什么是Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。 它有3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。. 阅读全文