From 7ead818fceabd94c713bc3f3acbc10577b55bc8c Mon Sep 17 00:00:00 2001 From: nonstriater <410495266@qq.com> Date: Sat, 28 Nov 2015 21:40:11 +0800 Subject: [PATCH] update format --- 算法问题选编/README.md | 35 ++++++--- 算法问题选编/二叉树.md | 5 ++ 算法问题选编/数值问题.md | 28 +++++++ 算法问题选编/数组数列问题.md | 148 +++++++++++++++-------------------- 4 files changed, 122 insertions(+), 94 deletions(-) diff --git a/算法问题选编/README.md b/算法问题选编/README.md index 7c3ce6d..860f726 100644 --- a/算法问题选编/README.md +++ b/算法问题选编/README.md @@ -6,18 +6,19 @@ 计算机处理的数据除了数值,就是字符。字符处理的常见问题包括: -单词反转 -回文判断 -字符串的压缩 -字符串的排列和组合 - -字符串比较 -子串 - +* 单词反转 +* 回文判断 +* 字符串的压缩 +* 字符串的排列和组合 +* 字符串比较 +* 子串 + ### 链表 +链表处理的常见问题包括: + * 链表反转 * 链表中是否有环 * 删除链表中的p节点,在p节点前面插入节点q, 要求O(1)复杂度 @@ -25,7 +26,6 @@ * 2个链表合并 - ### 堆和栈 这是最基本数据结构,相对容易理解 @@ -34,21 +34,36 @@ ### 数值问题 -这部分都是一些数学几何计算方面的问题。 +这部分都是一些数学几何计算方面的问题。 主要有: +* 位运算 +* 随机数 +* 大数问题 ### 数组数列问题 +这部分的问题都集中在数据集合上。主要有: + +* 数组排序 +* top-k +* 子数组 +* 多个数组合并,交集 + ### 矩阵 +这部分都是矩阵和二维数组相关的问题。 ### 二叉树 +* 遍历 +* 翻转 +* 子树 + ### 图 diff --git a/算法问题选编/二叉树.md b/算法问题选编/二叉树.md index 825e8af..f6ddadc 100644 --- a/算法问题选编/二叉树.md +++ b/算法问题选编/二叉树.md @@ -1,4 +1,9 @@ +问题涉及有: + +* 遍历 +* 翻转 +* 子树 #### 把二元查找树转变成排序的双向链表 diff --git a/算法问题选编/数值问题.md b/算法问题选编/数值问题.md index 0766b3f..1a89f5f 100644 --- a/算法问题选编/数值问题.md +++ b/算法问题选编/数值问题.md @@ -1,4 +1,10 @@ +这部分都是一些数学几何计算方面的问题。主要由: + +* 位运算 +* 随机数 +* 大数问题 + ### 字符串转整数 @@ -146,6 +152,28 @@ int div(const int x, const int y) +#### 数值的整数次方 + +题目:实现函数double Power(double base, int exponent),求base的exponent次方。 + +不需要考虑溢出。 + +分析:这是一道看起来很简单的问题。可能有不少的人在看到题目后30秒写出如下的代码: +``` +double Power(double base, int exponent) +{ + double result = 1.0; + for(int i = 1; i <= exponent; ++i) + result *= base; + return result; +} +``` + +上面的代码没有考虑 exponent<0的情况。 + + + + #### 求根号2的值 diff --git a/算法问题选编/数组数列问题.md b/算法问题选编/数组数列问题.md index b5fce1f..68464f2 100644 --- a/算法问题选编/数组数列问题.md +++ b/算法问题选编/数组数列问题.md @@ -1,4 +1,11 @@ +这部分的问题都集中在数据集合上。主要有: + +* 数组排序 +* top-k +* 子数组 +* 多个数组合并,交集 + #### 求子数组的最大和(最大字段和) @@ -145,11 +152,6 @@ int findaddends(int *data,int length,int sum,int *a,int *b); - -3. 有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N平均分布的,也就是说V[N]里面任意一个数都有1/N的机会被取出,要求空间复杂度为O(1) - - - #### 找数组里面重复的一个数 找数组里面重复的一个数,一个含n个元素的整数数组至少存在一个重复数, @@ -320,30 +322,7 @@ isShunZi(int *a,int length) - -#### 数值的整数次方 - -题目:实现函数double Power(double base, int exponent),求base的exponent次方。 - -不需要考虑溢出。 - -分析:这是一道看起来很简单的问题。可能有不少的人在看到题目后30秒写出如下的代码: -``` -double Power(double base, int exponent) -{ - double result = 1.0; - for(int i = 1; i <= exponent; ++i) - result *= base; - return result; -} -``` - -上面的代码没有考虑 exponent<0的情况。 - - - - -#### +#### 分割数组 一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。 能否只用一个额外数组和少量其它空间实现。 @@ -352,60 +331,6 @@ double Power(double base, int exponent) -////////////// 数列 /////////////// - -输入a1,a2,...,an,b1,b2,...,bn, -在O(n)的时间,O(1)的空间将这个序列顺序改为a1,b1,a2,b2,a3,b3,...,an,bn, -且不需要移动,通过交换完成,只需一个交换空间。 - -例如,N=9时,第2步执行后,实际上中间位置的两边对称的4个元素基本配对, -只需交换中间的两个元素即可,如下表所示。颜色表示每次要交换的元素,左边向右交换,右边向左交换。 -交换过程如下表所示 -交换x1,x3;交换x2,x4;再交换中间的x1,x4;交换y1,y2。 - - - - -给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 -要求下排每个数都是先前上排那十个数在下排出现的次数。 -上排的十个数如下: - -【0,1,2,3,4,5,6,7,8,9】 - -初看此题,貌似很难,10分钟过去了,可能有的人,题目都还没看懂。 - -举一个例子, -数值: 0,1,2,3,4,5,6,7,8,9 -分配: 6,2,1,0,0,0,1,0,0,0 -0在下排出现了6次,1在下排出现了2次, -2在下排出现了1次,3在下排出现了0次.... -以此类推.. - -0xX0+1xX1+2xX2....+9xX9 = 10; -X0+X1+...+ = 10; - -转换成多元一次方程求通解的问题。(Matlib) - - - - -一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值 - 比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; - {3,6}{2,4,3} m=2 - {3,3}{2,4}{6} m=3 所以m的最大值为3 - - - - -给出两个集合A和B,其中集合A={name}, -集合B={age、sex、scholarship、address、...}, -要求: -问题1、根据集合A中的name查询出集合B中对应的属性信息; -问题2、根据集合B中的属性信息(单个属性,如age<20等),查询出集合A中对应的name。 - - - - #### 约瑟夫环问题 n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, @@ -572,7 +497,6 @@ int print_sequence_sum(int n) 第1500个: 1500/22=68余4,一个周期内的前4个数是2,3,4,5; 最终答案是`68*30+5` - #### 调整数组顺序使奇数位于偶数前面 @@ -584,6 +508,7 @@ int print_sequence_sum(int n) ``` void reorder(int *data, int length); ``` + #### 在从1到n的正数中1出现的次数 @@ -674,5 +599,60 @@ f(n)= 1 n=1 +#### 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值 + + 比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; + {3,6}{2,4,3} m=2 + {3,3}{2,4}{6} m=3 所以m的最大值为3 + + + + +////////////// 数列 /////////////// + +输入a1,a2,...,an,b1,b2,...,bn, +在O(n)的时间,O(1)的空间将这个序列顺序改为a1,b1,a2,b2,a3,b3,...,an,bn, +且不需要移动,通过交换完成,只需一个交换空间。 + +例如,N=9时,第2步执行后,实际上中间位置的两边对称的4个元素基本配对, +只需交换中间的两个元素即可,如下表所示。颜色表示每次要交换的元素,左边向右交换,右边向左交换。 +交换过程如下表所示 +交换x1,x3;交换x2,x4;再交换中间的x1,x4;交换y1,y2。 + + + + +给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 +要求下排每个数都是先前上排那十个数在下排出现的次数。 +上排的十个数如下: + +【0,1,2,3,4,5,6,7,8,9】 + +初看此题,貌似很难,10分钟过去了,可能有的人,题目都还没看懂。 + +举一个例子, +数值: 0,1,2,3,4,5,6,7,8,9 +分配: 6,2,1,0,0,0,1,0,0,0 +0在下排出现了6次,1在下排出现了2次, +2在下排出现了1次,3在下排出现了0次.... +以此类推.. + +0xX0+1xX1+2xX2....+9xX9 = 10; +X0+X1+...+ = 10; + +转换成多元一次方程求通解的问题。(Matlib) + + + + +给出两个集合A和B,其中集合A={name}, +集合B={age、sex、scholarship、address、...}, +要求: +问题1、根据集合A中的name查询出集合B中对应的属性信息; +问题2、根据集合B中的属性信息(单个属性,如age<20等),查询出集合A中对应的name。 + + + +