摘要:
在不知道文件总行数的情况下,如何从文件中随机的抽取一行或是k行。已知random_m()随机数生成器的范围是[1, m] 求random_n()生成[1, n]范围的函数,m k时,要使得前n个数每个数被选中的概率都是k⁄n。 证明:假设n≥k,前n个数每个数被选中的概率都是k⁄n,则需要归纳证明前n+1个数每个数被选中的概率是k⁄(n+1)。 分两个角度去思考这个问题:一是第n+1个被选中的概率,很显然是k⁄(n+1)。二是第1、2、...、n个数被选中的概率也要是k⁄(n+1)。 后者分析:以第m个数为例(k 2 #include 3 #include 4 5 using na... 阅读全文
摘要:
亲戚题:已知a和b是亲戚,a和c是亲戚,则可以判断出b和c也是亲戚。将多个集合合并成没有交集的集合。 1 #include <iostream> 2 using namespace std; 3 4 int N, M, Q; 5 int pre[20000], rak[20000]; 6 7 void MakeSet(int x) 8 { 9 pre[x] = -1;10 rak[x] = 0;11 }12 13 int FindSet(int x)14 {15 int r = x, q;16 while (pre[r] != -1)17 r... 阅读全文
摘要:
Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。可以统计词频或是判断是否是前缀。1000万的广告库关键词,来一个查询词,找出是查询词子集的关键词集合。 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 #define MAX 256 6 #define MAXLEN 256 7 8 typedef struct _TrieNode 9 {10 int count;11 struct _Tri 阅读全文
摘要:
自己写一个函数实现类似库函数itoa的功能,将整数转化为字符串。整数转汉字,表示货币量。1、代码: 1 char *IntToStr(int num, char str[]) 2 { 3 int i = 0, j = 0; 4 char temp[100]; 5 while(num) 6 { 7 temp[i] = num % 10 + '0'; //取模运算得到从后往前的每一个数字变成字符 8 num = num / 10; 9 i++;10 }11 temp[i] = 0; //字符串... 阅读全文
摘要:
前序,中序,后序遍历的非递归实现。层次遍历,从上到下或从下到上,从左到右或从右到左,只输出叶子节点,只输出某一层等等。1、代码: 1 void PreOrder(BinaryTreeNode* root) 2 { 3 if (!root) return; 4 stack<BinaryTreeNode*> nodes; 5 while (root != NULL || !nodes.empty()) 6 { 7 if (root != NULL) 8 { 9 cout << root->m_nValue <<... 阅读全文
摘要:
输入两个整数m和n,从数列1,2,3...n中随意取几个数,使其和等于m,要求将所有可能组合列出来。已知有10分、5分和1分硬币无限个,要求把所有和为n分的组合列出来。1、思路: 定义函数F(n,m)为取n个数和为m的策略有两种选择,分别是F(n-1,m)和F(n-1,m-n)。 1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 template <typename T> 7 void PrintVector(vector<T>& vec) 8 { 阅读全文
摘要:
给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。(附加:除遍历计数器与a[N] b[N]外,不可使用新的变量,包括栈临时变量、堆空间和全局静态变量等);有一个整数数组,求出连续子数组的和的绝对值的最小值。1、思路: 先从前往后: B[0]=1, B[1]=A[0], B[2]=A[0]×A[1]... 再从后往前: temp = 1, temp *= A[n], B[n - 1] *= temp. 就得到除去n-1个数以外,其他数的乘积。 时间复杂度O(n),空间复杂度O(1),符合题目要求。 1 int M 阅读全文
摘要:
多段区间,求重合次数最多的区间或是给一个查询点判断该点在这些区间中存在的次数。多条线段,求线段覆盖长度,重合记为一次。1、思路: 非线段树:先对首尾排序(首尾端点没有差异),然后按顺序遍历结点,(L,+1)操作,(R,-1)操作。 1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 #define NUM 5 6 7 typedef struct _guest 8 { 9 int arrival;10 int leave;11 }g 阅读全文
摘要:
不使用atoi类似的库函数,将字符串转换为整形。写一个把字符串的IP地址变成32位整数的函数。1、思路: 核心:num = num * 10 + (*str - '0')。但是要考虑诸多方面因素:1、str是否为NULL,或为空"";2、正负号问题;3、数字溢出或是可能不是0~9之间的字符。所以要设置相应的全局变量来标记异常情况,只有str为"0"时,才正常输出0。那么程序整个过程是先设置输出0和全局变量为false,只有没有异常,才输出数字并将全局变量设置为true。 1 enum Status {kValid = 0, kInvali 阅读全文
摘要:
一个二维数组,每一行从左到右递增, 每一列从上到下递增。判断数组中是否含有该整数。求二维子数组和的最大值(任意维度子矩阵,固定维度2×2子矩阵)。矩阵原地转置(n×n方阵,m×n矩阵)。1、思路:(详细参考:http://justjavac.iteye.com/blog/1310178) 剑指offer中提供的时间复杂度是O(m+n),如果考虑将线性二分查找的思想用在矩阵二分查找中,速度可能会有提升。 假设查找17,第一次比较10,然后比较25,然后比较13,返回元素13,这时候再递归查找13左下角的矩阵和右上角的矩阵就可以了(红色椭圆部分);如果是查找9,第一次 阅读全文