首先,说明一下,很长时间没来写博客了,是的,前段时间忙考研,耽误了半年多,现在,考研初试成绩出来了,现在正准备复试,由于不冲突,我就在准备c/c++的复试,顺便写写自己的技术blog。我一直这样认为,写blog可以加深自己对知识的理解。言罢,今天写了来两个小算法,算是熟悉一下语言的应用。
关于和序列问题,即形如(数据不重复)
10=1+2+3+4
10=1+2+7
10=1+3+6
10=1+4+5
10=1+9
10=2+3+5
10=2+8
10=3+7
10=4+6
const int N = 10; /* test number */
/* print the numbers */
void print(int *list, int num)
{
int i;
cout<<N<<"="<<list[0];
for(i = 1; i < num; i ++)
cout<<"+"<<list[i];
cout<<endl;
}
/* key function here */
void getNumList(int sum, int begin,int *list ,int i)
{
int next;
list[i] = begin;
i++;
sum -= begin;
if(sum == 0) print(list,i);// be found
else
{
//continue searching the next number
for(next = begin+1; next <= sum; next++)
getNumList(sum,next,list,i);
}
}
int main(void)
{
int sum = N, begin;
int list[N/2];
/* test all beginings */
for(begin = 1; begin <= sum/2; begin ++)
getNumList(sum,begin,list,0);
return 0;
}
很容易理解,不错解释。
还有一道很老的腾讯面试题,类似题型:
写道
上个星期去腾讯面试一位主考官出的动脑题,当时被难住了,自己确实笨死了,麻烦高手帮解答下具体的计算思路。
题目如下:
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数
要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
例如:写道
####################
数值:0,1,2,3,4,5,6,7,8,9
分配:6,2,1,0,0,0,1,0,0,0
比如说,
0的下面我填写6,就表示在下面一共有6个0.
1的下面我填写2,表示下面下面一共有2个1
2的下面我填写1,表示下面下面一共有1个2
算法如下:
const int N = 10;
const int s[N] = {0,1,2,3,4,5,6,7,8,9};
/* repair the result list */
void repair(int *array)
{
int sum = 0;
for(int i = 1; i < N; i++)
sum += array[i];
array[0] = N - sum;
}
/* test the result list */
int isRight(int *r)
{
int i,j,sum;
for(i = 0; i < N; i++)
{
sum = 0;
//test the i number
for(j = 0; j < N; j++)
if(r[j] == s[i]) sum ++;
if(sum != r[i])//not match
return 0;
}
return 1;
}
/* print the right result list */
void print(int *array)
{
int i = 0;
for(; i < N; i++) cout<<array[i]<<" ";
cout<<endl;
}
/*
* key function
* serach from N to 0
* constrict 1
*/
void getSerial(int sum, int *result, int num)
{
int i;
/* case 1*/
if(num == 0 && sum != 0) return;
// not match here
/* case 2*/
if(sum == 0) // out of use
{
for(i = num; i > 0; i--) result[i] = 0;
// important point for result[0]:constrict 2
repair(result);
if(isRight(result)) //constrict 3
{
print(result);
return;
}
else return;
}
/* case 3*/
for(i = 0;i*s[num] <= sum; i++)
{
result[num] = i;
getSerial(sum-i*s[num],result,num-1);
}
}
可以注意到 该序列有三个限制条件(程序中也用constrict表示出来)
constrict 1: 就是两数组对乘的结果是N
由于该条件限制较强,好理解,所以用作循环条件,以便减少遍历次数
constrict 2:repair()修正0的个数(比较特殊)待改善
constrict 3:就是检验是s【】中个数是否和人r【】中的对应(最强限制,但最难利用理解)
分享到:
相关推荐
分治算法,求解最大连续子序列和问题,python实现。 分治算法是一种通过将复杂问题分解为更小的子问题,递归求解这些子问题,然后将结果合并以得到原问题的解的算法策略。以下是对分治算法求解最大连续子序列和问题...
在算法中,蚂蚁根据信息素、字符匹配得分以及位置偏差等信息决定选择各序列中字符的概率,通过信息素的更新与调节相结合的策略较为有效地解决了局部收敛的问题,加强了算法寻求全局最优解的能力。另外在该算法的基础...
文件“【优化求解】基于 Sobol 序列和纵横交叉策略的麻雀搜索算法(SSASC) Matlab源码.pdf”很可能包含了算法的详细描述、代码实现以及可能的实验结果分析。 在麻雀搜索算法中,通常包括以下几个关键步骤: 1. 初始...
5. **输出对齐**:打印出两个序列的对齐结果,可能包括匹配、插入和删除的标记。 在实际应用中,动态规划序列比对算法可以用于基因组分析、蛋白质结构预测、进化关系研究等多个领域。它们在处理大规模数据时可能会...
7. **处理异常和迭代控制**:在算法运行过程中,可能会遇到如无解、不收敛等问题,需要设定适当的处理策略。 Matlab中的`fmincon`函数,配合适当的算法选项,可以方便地实现SQP算法。另外,一些优化工具箱,如`...
总结来说,“分治法求解序列最大最小元素”是一种利用分治策略来高效找出序列中最大和最小元素的算法。通过分解、解决和合并三个步骤,我们可以递归地处理序列的子集,最终在对数时间内找到答案。这种方法不仅适用于...
今天遇到一个KMP算法的题,以前根本没见过,上网查了好多关于KMP,但是讲的都不是很清楚,看的一头雾水,然后就自己研究做出了一个小程序...希望这个小程序可以帮助大家很好的了解KMP算法Next及NextVal序列的求解算法!
之后,Ftakens和Grassberg等学者将时间序列与分形理论结合,证明了基于分形理论的时间序列非线性模型在预测上的优势,它们能更好地预测时间序列的未来变化和微小变化。 关联维数的定义是基于重构相空间的概念,它...
### 最长公共子序列动态规划算法 在计算机科学领域中,**最长公共子序列问题**(Longest Common Subsequence Problem, LCS)是一个经典的算法问题,它主要应用于文本比较、生物信息学中的DNA序列比对等领域。该问题...
时间序列数据是指按照时间顺序排列的一系列观测值,它通常具有趋势、季节性、周期性和随机波动等特征。在预测中,我们关注这些模式并试图捕捉它们以便做出准确的未来预测。 二、预测算法介绍 1. 简单移动平均(SMA...
动态规划算法的实现主要包含两个部分:LCSLength函数用于计算最长公共子序列的长度,LCS函数根据记录的信息输出最长公共子序列。 LCSLength函数通过两层循环遍历输入的两个序列,计算c[m][n]矩阵,其中c[i][j]表示...
序列二次规划(Sequential Quadratic Programming, SQP)是一种在优化领域广泛应用的算法,主要用于求解非线性约束优化问题。这种算法将原问题转化为一系列连续的二次子问题,通过迭代方式逐步逼近最优解。MATLAB...
动态规划法求解最长公共子序列问题与0-1背包问题 本实验报告旨在通过动态规划法解决最长公共子序列问题和0-1背包问题,以...同时,我们也掌握了算法设计、算法描述、算法正确性证明、算法复杂性分析和算法实现等技术。
这个压缩包中包含了一份名为"JAVA经典算法40题.doc"的文档,很可能是40道与Java相关的算法题目集合,涵盖了排序、搜索、图论、动态规划等多个领域。 首先,让我们来看看Java算法中的基础部分——排序算法。Java中...
在数学建模中,算法和求解器是至关重要的组成部分,它们用于解决各种复杂问题,尤其是在工程、科学和经济等领域。本主题主要关注的是三种特定的算法:EDA(Evolutionary Design Automation)遗传算法,模拟退火算法...
提供的压缩文件中的"que.txt"可能包含具体的面试题,"算法面试题大全.doc"可能是各种算法问题的集合,而"程序员面试智力、算法题汇总一.pdf"则可能包含更多智力和算法题目,这些资源可以帮助面试者深入理解和练习...
计算机算法分析与设计最大连续子序列是计算机科学领域中的一种经典算法问题,具有很高的实践价值和理论价值。解决该问题需要使用动态规划法,读取输入数据,记录最大和和历史最大的和,并输出最大和、最大连续子序列...
- **目的**:提出一种新的可行序列等式约束二次规划算法,旨在解决非线性不等式约束优化问题,并提高算法的计算效率。 #### 2. 算法特点 - **算法创新点**: - 该算法在每次迭代过程中只需求解三个相同规模的仅含...
传统的序列比对方法主要包括动态规划算法,如Needleman-Wunsch全局比对算法和Smith-Waterman局部比对算法。但当涉及到的序列数量较多时,这类方法由于计算复杂度高而变得效率低下,难以应用。为了解决这一问题,研究...
C-C算法,全称为"Correlation Coefficient"(相关系数)算法,是时间序列分析中用于确定最佳嵌入维数和延迟时间的一种方法。在复杂系统的研究中,时间序列分析是一个重要的工具,它能帮助我们理解系统的动态行为。C-...