zoukankan      html  css  js  c++  java
  • 结对开发——求最大值

    一、题目:

          返回一个整数数组中最大子数组的和。

      要求:

      1.输入一个整形数组,数组里有正数也有负数。

      2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

      3.求所有子数组的和的最大值。要求时间复杂度为O(n)。

    二、设计思路

      1.数组num[]长度已确定是N,将数组中字数组的和放到数组sum[]中;

      2.sum[0]=num[0],sum[1]=num[0]+num[1],sum[2]=num[0]+num[1]+num[2]……;

         sum[N]=num[1],sum[N+1]=num[1]+num[2]……如此循环,直至所有自己的和全部存进  数组sum中;

      3.然后求出数组sum中的最大值,再输出结果;

          4.单独判断一些特殊的容易计算的情况,比如全是负数、全是正数、只有一个正数。这样能有效地提高程序的效率。

    三、源代码

     1 // 求和.cpp : Defines the entry point for the console application.
     2 // 2015/3/18 16:12 袁佩佩 于海洋 信1201-1班
     3 
     4 #include "stdafx.h"
     5 #include"iostream.h"
     6 #define SIZE 5                                    //数组的个数
     7 #define MAXSIZE 100                                //子集个数的最大值
     8 void CaculateSum(int sum[],int length,int num[])//计算数组中各个子集的和
     9 {
    10     int j=0;
    11     for(int i=0;i<SIZE;i++)
    12     {
    13         for(int k=i;k<SIZE;k++)
    14         {
    15             if(i==k)
    16             {
    17                 sum[j]+=num[k];
    18             }
    19             else
    20             {
    21                 sum[j]=sum[j-1]+num[k];
    22             }
    23             j++;
    24         }
    25     }
    26 }
    27 //求所有情况的个数
    28 int GetAcc()
    29 {
    30     int acc=0;
    31     for(int i=1;i<=SIZE;i++)
    32     {
    33         acc+=i;
    34     }
    35     return acc;
    36 }
    37 //找出数组中的最大值,length是b[]中的个数
    38 int GetMax(int b[],int length)
    39 {
    40     int max=b[0];
    41     for(int i=0;i<length;i++)
    42     {
    43         if(max<b[i])
    44         {
    45             max=b[i];
    46         }
    47     }
    48     return max;
    49 }
    50 int main()
    51 {
    52     int num[SIZE],sum[MAXSIZE],max=0,acc;
    53     int count[2]={0,0};                        //num[num]是要求的整数count[2]中是负数和正数的个数
    54     cout<<"请输入"<<SIZE<<"个整数:";
    55     for(int i=0;i<SIZE;i++)                    //计算数组中正数和负数的个数
    56     {
    57         cin>>num[i];
    58         if(num[i]<0)
    59             count[0]++;                        //负数的个数
    60         else
    61             count[1]++;                        //正数
    62     }
    63     acc=GetAcc();
    64     for(i=0;i<acc;i++)
    65     {
    66         sum[i]=0;
    67     }
    68     if(count[0]==0)                            //若全是正数的话
    69     {
    70         for(int i=0;i<SIZE;i++)
    71         {
    72             max+=num[i];
    73         }
    74     }
    75     else if((count[1]==0)||(count[0]==1))    //若全是负数或者有一个正数
    76     {
    77         max=GetMax(num,SIZE);
    78     }
    79     else                                    //其他情况
    80     {
    81         CaculateSum(sum,acc,num);
    82         max=GetMax(sum,acc);
    83     }
    84     cout<<"最大子集的和是:"<<max<<endl;
    85     return 0;
    86 }

    四、结果截图

    五、心得体会

      我和于同学之前就经常合作,所以这次搭档还算顺利。我俩上课的时候就讨论出了这个题目的大体思路,今天我们又对算法的具体实现进行了讨论和调试。

      俗话说:“男女搭配,干活不累。”我比较细心,他比较有执行力。于同学可以带起整个编程创作的气氛,我也很快进入状态,能够及时准确的发现他的错误并快速改正。整个过程效率比自己编程时要高。

      其实一开始我根据我和搭档确定的思路写出了算法,但是运行时有错并且特别复杂。我们调试了几次都没能成功,于是他就换了种思考方式,很快写了新的算法。经过几次调试之后,程序成功运行了。这一点我挺欣赏他的,因为它发现这条路走不通或特别难走时,可以马上改变路径正确的到达目的地。

    六、有图有真相

      请无视我那无神的双目,和那油油的头发...

     

  • 相关阅读:
    Android滑动菜单框架完全解析,教你如何一分钟实现滑动菜单特效
    Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
    Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果
    各产品编译及串口烧录
    C 语言代码规范
    烧录
    共享目录
    openwrt Makefile
    netfilter 参考pywj的《netfilter + nf_conntrack + iptables》
    iptables问题
  • 原文地址:https://www.cnblogs.com/JJJanepp/p/4346942.html
Copyright © 2011-2022 走看看