
算法学习
花花呀123456
爱好c,c++
展开
-
给你一个长度为N的链表。N很大,但你不知道N有多大。你的任务是从这N个元素中随机取出k个元素
给你一个长度为N的链表。N很大,但你不知道N有多大。你的任务是从这N个元素中随机取出k个元素。你只能遍历这个链表一次。你的算法必须保证取出的元素恰好有k个,且它们是完全随机的(出现概率均等)。 答案来自网络: 蓄水池抽样:先保存前k个元素, 从第k+1个元素开始, 以1/i (i=k+1, k+2,…,N) 的概率选中第i个元素,并随机替换掉一个已保存的记录,这样遍历一次得到k个元转载 2016-06-07 20:21:07 · 2105 阅读 · 0 评论 -
筛素数法(改进版)
改进的筛素数法 本文转载自:http://blog.youkuaiyun.com/morewindows/article/details/7347459 非常感谢作者提供的学习机会,这里只是copy过来方便自己学习。 最简单的筛素数法方法就是从2开始,将所以2的倍数去掉,然后从3开始,将3的倍数去掉。根据这样很容易写出代码,下面代码就是是转载 2016-06-05 09:40:18 · 997 阅读 · 0 评论 -
位操作总结
位操作总结 本文转载自: http://blog.youkuaiyun.com/morewindows/article/details/7354571 谢谢原作者提供的学习机会。 位操作篇共分为基础篇和提高篇,基础篇主要对位操作进行全面总结,帮助大家梳理知识。提高篇则针对各大IT公司如微软、腾讯、百度、360等公司的笔试面试题作详细的解答,使大家能熟练应对在转载 2016-06-05 09:55:58 · 512 阅读 · 0 评论 -
冒泡排序算法的实现
本文转载自: http://blog.youkuaiyun.com/morewindows/article/details/6657829 冒泡排序是非常容易理解和实现,,以从小到大排序举例:设数组长度为N。1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3转载 2016-06-05 15:51:13 · 461 阅读 · 0 评论 -
直接插入排序
转载自:http://blog.youkuaiyun.com/morewindows/article/details/6665714 直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。 设数组为a[0…n-1]。1. 初始时,a[0]自成1个有序区转载 2016-06-05 17:04:56 · 384 阅读 · 0 评论 -
找到0-N数组中至少一个重复元素
转载自:http://blog.youkuaiyun.com/morewindows/article/details/8204460 最近在微博上看到一道有趣的GOOGLE面试题,见下图:文字版:一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。 这个题目要求转载 2016-06-05 20:34:11 · 942 阅读 · 0 评论 -
找出数组中只出现一次的两个数字
转载自:http://blog.youkuaiyun.com/morewindows/article/details/8214003 首先来看题目要求:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。 考虑下这个题目的简化版——数组中除一个数字只出现1次外,其它数字都成对出现,要求尽快找出这个数字。这个题目在之前的《位操作基础篇之位操作全转载 2016-06-05 21:20:26 · 628 阅读 · 0 评论 -
合并两个有序链表,让结果ren仍然有序
转载自: http://www.cnblogs.com/heyonggang/p/3405179.html 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如下图中的链表1和链表2,则合并之后的升序链表如链表3所示。 链表结点定义如下:struct ListNo转载 2016-06-06 21:52:27 · 1409 阅读 · 0 评论 -
快速排序的实现
转载自: http://blog.youkuaiyun.com/morewindows/article/details/6684558 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的转载 2016-06-06 22:47:48 · 588 阅读 · 0 评论 -
两棵二叉树的最低共同节点
转载自:http://zhedahht.blog.163.com/blog/static/25411174201081263815813/ 题目:二叉树的结点定义如下:struct TreeNode{ int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight;};转载 2016-06-10 09:35:46 · 1210 阅读 · 0 评论 -
链表复制算法的变体
转载自:http://zhedahht.blog.163.com/blog/static/254111742010819104710337/ 题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: struct ComplexNode转载 2016-06-10 08:46:20 · 1316 阅读 · 0 评论 -
判断一棵树是不是另外一棵树的子树
转载自:http://zhedahht.blog.163.com/blog/static/25411174201011445550396/ 题目:二叉树的结点定义如下:struct TreeNode{ int m_nValue; TreeNode* m_pLeft; TreeNode* m_pRigh转载 2016-06-09 22:07:27 · 3784 阅读 · 0 评论 -
判断二叉树是不是平衡树
转载自: http://zhedahht.blog.163.com/blog/static/25411174201142733927831/ 题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下图中的二叉树就是一棵平衡二叉树:在本系列博客的第27题,我们曾介绍过如何转载 2016-06-07 22:01:58 · 1229 阅读 · 0 评论 -
求二叉树的高度
转载自:http://zhedahht.blog.163.com/blog/static/25411174200732975328975/ 题目:输入一棵二元树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如:输入二元树:转载 2016-06-07 22:06:03 · 13061 阅读 · 0 评论 -
求字符串的所有组合
转载自: http://zhedahht.blog.163.com/blog/static/2541117420114172812217/ 题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。分析:在本系列博客的第28题《字符串的排列》中,我们详细讨论了如何用递归的思路求字符串的排列。同样,本题转载 2016-06-08 22:14:40 · 1753 阅读 · 0 评论 -
求字符串的排列
转载自:http://zhedahht.blog.163.com/blog/static/254111742007499363479/ 题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司转载 2016-06-08 22:30:00 · 982 阅读 · 0 评论 -
利用全排列八皇后问题的一种解法
转载自: http://zhedahht.blog.163.com/blog/static/2541117420114331616329/ 题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。转载 2016-06-09 15:08:31 · 2928 阅读 · 0 评论 -
O(n)时间的排序
转载自:http://zhedahht.blog.163.com/blog/static/25411174201131184017844/ 题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。分析:排序是面试时经常被提及的一类题目,我们也熟悉其中很多种算法,诸如插入排序、归并排序、冒泡排序,快速排序等等。这些排序转载 2016-06-09 15:20:57 · 1139 阅读 · 0 评论 -
不用+、-、×、÷做加法
转载自:http://zhedahht.blog.163.com/blog/static/254111742011125100605/题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。分析:这又是一道考察发散思维的很有意思的题目。当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关键所在。看到的这个题目,我的第一反应是傻转载 2016-06-09 21:23:39 · 1149 阅读 · 0 评论 -
顺时针打印矩阵
转载自:http://zhedahht.blog.163.com/blog/static/254111742010111112236313/ 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1 2 3 45 6转载 2016-06-09 21:51:27 · 1132 阅读 · 0 评论 -
归并排序的实现
转载自:http://blog.youkuaiyun.com/morewindows/article/details/6678165 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个转载 2016-06-06 23:03:05 · 951 阅读 · 0 评论