1. 程式人生 > >常用演算法題目總結一(陣列篇)

常用演算法題目總結一(陣列篇)

如何用遞迴實現陣列求和?

程式碼如下:

#include "stdafx.h"
#include<iostream>
#include<string>

using namespace std;
template<class T>
T GetSum(T* a,int n)
{
    if(0==n)
    {
        return 0;
    }
    return GetSum(a,n-1)+*(a+n-1);
}

int _tmain(int argc, _TCHAR* argv[])
{
    int data[]={1,2,3
,4,5}; cout<<GetSum<int>(data,5); system("pause"); return 0; }

如何用一個for迴圈打印出一個二維陣列?

程式碼如下:

#include "stdafx.h"
#include<iostream>
using namespace std;

void PrintArray()
{
    const int x=2;
    const int y=3;
    int data[x][y]={1,2,3,4,5,6};
    for(int i=0;i<x*y;i++)
    {
        cout
<<data[i/y][i%y]<<endl; //這裡是重點 } } int _tmain(int argc, _TCHAR* argv[]) { PrintArray(); system("pause"); return 0; }

如何用遞迴演算法判斷一個數組是否是遞增?

程式碼如下:

#include "stdafx.h"
#include<iostream>
using namespace std;

template<class T>
bool IsIncreaseArray(T* p,int
n) { //這裡預設陣列長度大於等於2,因為陣列長度小於2的話,問題無意義。 if(2==n) { return *p<*(p+1); } if(*(p+n-1)>*(p+n-2)) { return IsIncreaseArray(p,n-1); } else { return false; } } int _tmain(int argc, _TCHAR* argv[]) { int data[]={1,2,3,4,5}; cout<<IsIncreaseArray<int>(data,5); system("pause"); return 0; }

二分查詢演算法的實現

二分查詢法也稱折半查詢法,它的思想是每次都與序列中的中間元素進行比較,前提是陣列是有序的。
程式碼如下:

#include "stdafx.h"
#include<iostream>
#include<string>

using namespace std;

//非遞迴實現
template<class T>
int BinarySearch(T* a,const int len,const T data)
{
    if(nullptr==a||len<=0)
    {
        return -1;
    }

    int low=0;
    int top=len-1;
    while(low<=top)
    {
        int pos=low+(top-low)/2;
        if(data==a[pos])
        {
            return pos;
        }
        else if(data<a[pos])
        {
            top=pos-1;
        }
        else
        {
            low = pos+1;
        }
    }

    return -1;
}

//遞迴實現
template<class T>
int BinarySearchRecursion(T* a,const T data,int low,int top)
{
    if(nullptr==a||low>top)
    {
        return -1;
    }

    int pos=low+(top-low)/2;
    if(data==a[pos])
    {
        return pos;
    }
    else if(data<a[pos])
    {
        return BinarySearchRecursion(a,data,low,pos-1);
    }
    else 
    {
        return BinarySearchRecursion(a,data,low+1,pos);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    int data[]={1,2,3,4,5};
    cout<<BinarySearch(data,5,4);
    cout<<BinarySearchRecursion(data,4,0,4);
    system("pause");
    return 0;
}

如何在排序陣列中,找出給定數字出現的次數

下面這段程式碼是在二分查詢法的基礎上進行改進,找出最左側的位置和最右測的位置,做差得出次數。
程式碼如下:

#include "stdafx.h"
#include<iostream>
using namespace std;

template<class T>
int BinarySearchCount(T* a, const int len, const T data, bool isLeft)
{
    int left = 0;
    int right = len - 1;
    int last = -1;
    while (left <= right)
    {
        int pos = (left + right) / 2;
        if (data < a[pos])
        {
            right = pos - 1;
        }
        else if (data > a[pos])
        {
            left = pos + 1;
        }
        else
        {
            last = pos;
            if (isLeft)
            {
                right = pos - 1;
            }
            else
            {
                left = pos + 1;
            }
        }
    }

    return last;
}

int main()
{
    int data[] = { 0,1,2,2,2,2,2,2,2,34,45,56 };
    int low = BinarySearchCount<int>(data, sizeof(data) / sizeof(data[0]), 2, true);
    int top = BinarySearchCount<int>(data, sizeof(data) / sizeof(data[0]), 2, false);
    cout << (top - low + 1);

    system("pause");
    return 0;
}

如何計算兩個有序整型陣列(沒有重複元素)的交集?

例如 a={0,1,2,3,4};b={1,3,5,7,9}; 交集為{1,3}。
二路歸併遍歷兩個陣列
程式碼如下:

#include "stdafx.h"
#include<stdio.h>
#include<iostream>
#include<vector>
#include<map>
using namespace std;
int mixed(int a[],int na,int b[],int nb,int m[])
{
    int i=0,j=0,k=0;
    while(i<na&&j<nb)//直到有一個數組結束遍歷就停止
    {
        if(a[i]==b[j])
        {
            m[k++]=a[i];
            ++i;
            ++j;
        }
        else if(a[i]<b[j])
        {
            ++i;
        }
        else
        {
            ++j;
        }
    }
    return k;
}
int _tmain(int argc, _TCHAR* argv[])  
{  
    int a[]={0,1,2,3,4};
    int b[]={1,3,5,7,9};
    int buff[5];
    int len=mixed(a,5,b,5,buff);
    cout<<"mix data:";
    for(int i=0;i<len;++i)
    {
        cout<<' '<<buff[i];
    }

    return 0;   
}

如何找出陣列中重複次數最多的數?

利用map對映表,first記錄數值,second記錄數值出現的次數。
程式碼如下:

#include "stdafx.h"
#include<stdio.h>
#include<iostream>
#include<vector>
#include<map>
using namespace std;
bool findMaxFreq(int a[],int n,int&val)
{
    if(n<1)
        return false;

    std::map<int,int> m_map;    //map對映
    for(int i=0;i<n;i++)
    {
        if(++m_map[a[i]]>=m_map[val])
            val=a[i];
    }
    return true;
}
int _tmain(int argc, _TCHAR* argv[])  
{  
    int a[]={0,1,2,3,3,3,4,4};
    int v=0;
    if(findMaxFreq(a,8,v))
        cout<<v;

    return 0;   
}