1、我的GitHub用户
首先,接触到现代程序设计这门课之后我才正式开始使用GitHub和它的客户端,以前都是去网站看代码、扒样例。我注册的账户名为:hennande。目前该账户中有我的第一份关于homework-01的代码和记录。
2、我的教科书
代码大全 (第二版) 斯蒂夫·迈克康奈尔。(这本书又是一时半会儿看不完的节奏啊!……!)
3、最大连续子数组问题
我的思路:
假设一个数组的最大连续子数组已知,那么这个连续子数组会具有什么特点呢?
首先,与之首尾相连的元素如果存在,一定是大于等于零的;其次,与之数位相连的子数组如果存在,那么该子数组的和一定是小于等于零的。暂时不考虑存在两个极大连续子数组和相等的情况而产生的优先解判定问题,那么只需从数组的开始进行扫描,每新扫描一个元素就对它以及它之前的子数组是否就有最大连续子数组的特性进行判断,同时对最大值和起始终止位标示进行调整,直到扫描结束即可得到问题的解。
我的源码:
#include <stdio.h> #include <stdlib.h> int main() { int a[20],tempsub,maxsub,i,n; printf("array length="); scanf("%d",&n); tempsub=maxsub=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); tempsub+=a[i]; if(tempsub<0) tempsub=0; if(tempsub>maxsub) maxsub=tempsub; } printf("%d ",maxsub); return 0; }
我的结果:
我的分析:
如果以加法操作作为计算复杂度的操作单位,我的算法最多进行n次加法操作,属于O(n)复杂度的算法,基本接近正确方法。研究完答案的代码,发现像答案那样写动态规划的思想更明显,而我自己的做法更像是“投机取巧”。
更改后的版本:
修改源码:
#include <stdio.h> #include <stdlib.h> int main() { int a[20],tempsub,minsub,maxsub,i,n; printf("array length="); scanf("%d",&n); tempsub=0; //to get the minimum maxsub, find the minimum subarray; for(i=0;i<n;i++) { scanf("%d",&a[i]); if(i==0) minsub=a[0]; if(minsub>a[i]) minsub=a[i]; } maxsub=minsub; for(i=0;i<n;i++) { if(tempsub+a[i]>a[i]) tempsub=tempsub+a[i]; else tempsub=a[i]; if(tempsub>maxsub) maxsub=tempsub; } printf("%d ",maxsub); return 0; }
错误原因:
当时写第一个算法的时候就有一种“投机取巧”的感觉,也没有进行仔细的测试就贴了出来,研究完GitHub的使用之后才发现,我的第一个方法原来不适合于最大子数组和为负的情况,当然,看过正确的方法之后,加之修改了一通之后,确实意识到了错误的根源,也就老老实实用动归了。
我的感想:
不得不说,没有进行过相关的程序设计训练的人,对于程序的测试还是很缺少感觉的。做出来的测试点也不具有广泛的代表性,需要提高相关的思维能力。