常用演算法題目總結一(陣列篇)
阿新 • • 發佈:2019-01-01
如何用遞迴實現陣列求和?
程式碼如下:
#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;
}