zoukankan      html  css  js  c++  java
  • 数组求和算法系列

     数组求和算法系列

     

    一直想写一个数组求和算法系列博客,但由于自己算法能力有限,完成不了,只能完成其中简单的部分,难的部分希望有园友愿意和我一起完成。在写这篇博客的过程中借用了别人的思路,有的的确是要一定的算法和数据结构基础,特别是对递归的理解,到现在为止我觉得我还没有真正的理解递归。我一向不太喜欢废话,我的博客要么是有关分析的,要么就是源码 

    下面的代码希望对你有所帮助: 

    1.         在排序数组中查找和为给定值的两个数字,输出一对 

     

    代码
    //在排序数组中查找和为给定值的两个数字,输出一对
    void FineTwo(int*A,int size,int n)
    {
    if(n<1|| size<1)
    {
    return;
    }
    int beg=0;
    int end=size-1;
    while(beg<end)
    {
    if(A[beg]+A[end]==n)
    {
    cout
    <<A[beg]<<"\t"<<A[end]<<endl;
    break;
    }
    if(A[beg]+A[end]<n)
    {
    ++beg;
    }
    else
    {
    --end;
    }
    }

       

    2.         在排序数组中查找和为给定值的两个数字,输出所有对 

     

    代码
    //在排序数组中查找和为给定值的两个数字,输出所有对
    void FineAll(int*A,int size,int n)
    {
    if(n<1|| size<1)
    {
    return;
    }
    int beg=0;
    int end=size-1;
    while(beg<end)
    {
    if(A[beg]+A[end]==n)
    {
    cout
    <<A[beg]<<"\t"<<A[end]<<endl;
    ++beg;
    }
    if(A[beg]+A[end]<n)
    {
    ++beg;
    }
    else
    {
    --end;
    }
    }
    }

     

    3.         输出1~M中,所有连续的和等于N的数 

     

    代码
    //输出1~M中,所有连续的和等于N的数
    void FindContinueSequence(int size,int n)
    {
    if(size<1|| n<1)
    {
    return;
    }
    int beg=1;
    int end=2;
    int sum=beg+end;
    while(beg<size)
    {
    if(sum==n)
    {
    print(beg,end);
    }

    while(sum>n)
    {
    sum
    -=beg++;
    if(sum==n)
    {
    print(beg,end);
    }
    }
    sum
    +=++end;
    }
    }

    void print(int beg,int end)
    {
    for(int i=beg;i<=end;i++)
    {
    cout
    <<i<<"\t";
    }
    cout
    <<endl<<endl;
    }

     

    4.         输出字符串的所有排列 

     

    代码
    //输出字符串的所有排列
    void Permutation(string a, int start)
    {
    int end=a.length()-1;
    if(start == end)
    {
    cout
    <<a<<endl;
    }
    else{
    staticchar tmp=NULL;//静态变量的定义只执行一次,而非静态变量在递归的过程中不停的构造和析构,当然它析构得比较晚
    for(int i = start; i <= end; i++)
    {
    tmp
    =a[start]; a[start]=a[i]; a[i]=tmp;
    Permutation(a, start
    +1);
    tmp
    =a[start]; a[start]=a[i]; a[i]=tmp;
    }
    }
    }

     

    5.         输出字符串的所有组合

    代码
    //输出字符串的所有组合
    void combine(char* str)
    {
    if(str == NULL)
    {
    return;
    }

    int length = strlen(str);
    vector
    <char> res;
    for(int i =1; i <= length; ++ i)
    {
    combine(str, i, res);
    }
    }

    void combine(char* str, int num, vector<char>& res)
    {
    if(num==0)
    {
    vector
    <char>::iterator iter = res.begin();
    for(; iter < res.end(); ++ iter)
    {
    cout
    <<*iter<<"\t";
    }
    cout
    <<endl;
    }
    else{
    if(*str =='\0')
    {
    return;
    }

    res.push_back(
    *str);
    combine(str
    +1, num -1, res);
    res.pop_back();
    combine(str
    +1, num, res);
    }
    }

     

      

    6.         找出排序数组中所有和等于给定数的所有序列 

      我本来的思路是想找出由最小的一组数的和等于给定的数,然后对这一组数进行组合,得出其他的一些序列,后来发现这个思路有缺陷,就放弃了,暂时还没有想到其他的思路。 

    7.         找出由最小的一组数的和等于给定的数,又延伸延伸出另一个题目:在排序数组中,找出由个数最多的一组和等于给定数的序列。 

     

    我的错误代码
    //arr排序数组,bSize得出的序列元素个数,sum给定数,后来发现这个思路又是错的
    int* getBaseArr(int* arr,int& bSize,int sum)
    {
    int tmpSum=arr[0];
    int i=1;
    while(tmpSum<sum)
    {
    tmpSum
    +=arr[i++];
    }

    int k=0;
    if(tmpSum>sum)
    {
    k
    =tmpSum-sum;
    for(int j=0;j<i;j++)
    {
    if(k!=arr[j])
    {
    continue;
    }
    k
    =j;
    --i;
    break;
    }
    }
    else{
    k
    =i;
    }

    int* a=newint[i];
    for(int j=0;j<i;j++)
    {
    if(j<k)
    {
    a[j]
    =arr[j];
    }
    else
    {
    a[j]
    =arr[j+1];
    }
    }

    bSize
    =i;
    return a;
    }

     

    8.  在排序数组中,找出由个数最少的一组和等于给定数的序列。 

    6,7,8题,希望有兴趣的园友可以做一下

     

    作者:陈太汉

    博客:http://www.cnblogs.com/hlxs/

       QQ584917974

     

  • 相关阅读:
    Perl分片技术
    Perl的time、localtime和gmtime函数
    Perl文件名通配和文件查找
    Perl复制、移动、重命名文件/目录
    Perl文件、目录常用操作
    Perl文件测试操作和stat函数
    Linux终端会话实时共享(kibitz)
    Perl的IO操作(2):更多文件句柄模式
    Perl的IO操作(1):文件句柄
    Perl文件句柄相关常量变量
  • 原文地址:https://www.cnblogs.com/hlxs/p/2151828.html
Copyright © 2011-2022 走看看