博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构与算法2--数组常见操作
阅读量:4289 次
发布时间:2019-05-27

本文共 4660 字,大约阅读时间需要 15 分钟。

数据结构与算法2--数组常见操作

 

数组是最常见也是我们使用最多的数据结构了,它是一块连续的内存空间,以下标来描述空间的位置,C++中int arr[len]表示的的数组一旦配置后大小就无法改变,vector<int> v表示的数组可以动态增加。以下是笔者根据数组的特性和平时使用情况完成的一些基本功能,后续将根据使用情况再增加相关功能。

 

1、功能

00-打印数组

01-合并两个有序的数组
02-将数组排序为最小数字
03-查找连续的子序列
04-数组中逆序对
05-求素数对
06-求数组中是否有重复的数
07-求数组中和为S的数对
08-给定数组求新数组

 

2、代码

#include 
#include
#include
#include
#include
#include
using namespace std;/*该文件夹包含array相关的各类常用功能和算法*//*Menu00-打印数组01-合并两个有序的数组02-将数组排序为最小数字03-查找连续的子序列04-数组中逆序对05-求素数对06-求数组中是否有重复的数07-求数组中和为S的数对08-给定数组求新数组*/void PrintArray(const int arr[],const int len);//00void PrintArray(const vector
&arr);//00void MergeSortedArray(int A[],int m,int B[],int n);//01string PrintMinNumber(vector
nums);//02vector
> FindContinuousSequence(int sum);//03int InversePairs1(vector
data);//04-1循环方法int InversePairs2(vector
data);//04-2归并方法int GetSuShuNum(int n);//05bool IfDuplicate(vector
v,int &num);//06vector
FindNumbersWithSum(vector
array,int sum);//07//00-打印数组void PrintArray(const int arr[],const int len){ cout<<'['; for(int i=0;i
&arr){ cout<<'['; for(int i=0;i
=0 && n1>=0) { if(A[m1]>=B[n1]) { A[s--] = A[m1--]; }else { A[s--] = B[n1--]; } } if(n1>=0) { for(int i=0;i<=n1;i++) A[i] = B[i]; }}void TestMergeSortedArray(){ int A[9] = {1,2,3,4,5}; int B[4] = {2,4,6,8}; MergeSortedArray(A,5,B,4); PrintArray(A,9);}//02-将数组排序为最小数字bool CompareNumbers(int n1,int n2){ stringstream itoa; itoa<
nums){ //例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 string str=""; if(nums.size()==0) return str; sort(nums.begin(),nums.end(),CompareNumbers); for(int i=0;i
v(arr,arr + sizeof(arr)/sizeof(int)); string str = PrintMinNumber(v); cout<
<
> FindContinuousSequence(int sum) { //输出所有和为Sum的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 vector
> vret; int n = sqrt(2*sum);//n((n+1)/2= sum for(int i=2;i<=n;++i) { vector
tmp; if(i&0x01) { if((sum%i)==0) { int mid = sum/i; int first = mid - i/2; for(int j=0;j
>v; v = FindContinuousSequence(21); for(int i=0;i
data) { long long ret = 0; //* 时间复杂度O(n^2) for(int i=0;i
data[j]) ret++; } return (ret%1000000007);}int InversePairsCore(vector
&data, vector
©,int start, int end) { if(start==end){ copy[start] = data[end]; return 0; } int len = (end-start)/2; int left = InversePairsCore(copy,data,start,start+len); int right = InversePairsCore(copy,data,start+len+1,end); //i初始化为前半段最后一个数字的下标 int i = start + len; //j初始化为后半段最后一个数字的下标 int j = end; int indexCopy = end; int count = 0; while(i>=start && j>=(start+len+1)) { if(data[i]>data[j]) { copy[indexCopy--] = data[i--]; count += j-start-len; }else { copy[indexCopy--] = data[j--]; } } for(;i>=start;--i) { copy[indexCopy--] = data[i]; } for(;j>=start+len+1;--j) { copy[indexCopy--] = data[j]; } return left+right+count;}int InversePairs2(vector
data) { int ret = 0; if(data.size()==0) return 0; std::vector
vcopy; for(int i=0;i
v(arr,arr+sizeof(arr)/sizeof(int)); cout<
<
v,int &num){ if(left==0) { num++; return; }else if(left>0 && v.size()>0) { vector
v1 = v; for(int i=0;i
v; for(int i=1;i<=n;i++) { if(IsSuShu(i)) { v.push_back(i); } } //使用递归查找有效数对 PrintArray(v); int len = v.size(); for(int i=0;i
v,int &num){ //长度为n的数组v,其每个元素大小在0-n-1之间,num保存重复的数 if(v.size()==0) return false; for(int i=0;i
(v.size()-1)) return false; } for (int i = 0; i < v.size(); ++i) { while(v[i]!=i) { if(v[i] == v[v[i]]) { num = v[i]; return true; } int tmp = v[i]; v[i] = v[v[i]]; v[tmp] = tmp; } } return false;}void TestIfDuplicate(){ int num = 0; int arr[] = {1,2,3,4,5,6,7,7,8,9,9,10}; std::vector
v(arr,arr+sizeof(arr)/sizeof(int)); (IfDuplicate(v,num))?(cout<<"True\t"<
<
<<"False\t"<
FindNumbersWithSum(vector
array,int sum){ //输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, //如果有多对数字的和等于S,输出两个数的乘积最小的。 vector
vret; int min = 0; int max = array.size()-1; while(min
sum)) --max; while(min
v(arr,arr+sizeof(arr)/sizeof(int)); std::vector
vret = FindNumbersWithSum(v,15); PrintArray(vret);}//08--给定数组求新数组vector
multiply(const vector
& A) { //给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素 //B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。 vector
v1,v2,vret; int ret = 1; int len = A.size(); for(int i=0;i
0){ret = ret*A[i-1];v1.push_back(ret);} else v1.push_back(1); } ret = 1; for(int j=len-1;j>=0;--j) { if(j
v(arr,arr+sizeof(arr)/sizeof(int)); vector
vret = multiply(v); PrintArray(vret);}int main(){//01-合并两个有序的数组 //TestMergeSortedArray();//02-将数组排序为最小数字 //TestPrintMinNumber();//03-查找连续的子序列 //TestFindContinuousSequence();//04-数组中逆序对 //TestInversePairs();//05-求素数对 //TestGetSuShuNum();//06-求数组中是否有重复的数 //TestIfDuplicate();//07-求数组中和为S的数对 //TestFindNumbersWithSum();//08-给定数组求新数组 TestMultiply(); return 0;}

 

3、说明

当前已在mingw32(gcc 4.9.2)上测试通过。

 

转载地址:http://bflgi.baihongyu.com/

你可能感兴趣的文章
网络_Xutils
查看>>
网络_多线程下载
查看>>
网络_httpClient
查看>>
网络_HttpURLConnection_原始类
查看>>
网络_OKHttp
查看>>
android_事件分发机制_几行代码直接通晓
查看>>
图片_OOM_OutOfMemory
查看>>
技术学习_经验分享
查看>>
android中常见的设计模式有哪些?
查看>>
ViewDragHelper_v4的滑动视图帮助类_解释和代码
查看>>
即时通讯技术- 推送技术协议方案
查看>>
vitamio简介.java
查看>>
ActiveMQ 实现负载均衡+高可用部署方案
查看>>
《搜索和推荐中的深度匹配》——2.5 延伸阅读
查看>>
解读:阿里文娱搜索算法实践与思考
查看>>
基于位置的点击模型
查看>>
链表操作算法题合集
查看>>
Crackme3 破解教程
查看>>
奖学金评比系统(数据库系统设计版)
查看>>
HTTP Live Streaming直播
查看>>