1. 循环左移
将一个具有 n 个元素的数组A[n]向左循环移动k个位置,要求时间复杂度为O(n),空间复杂度为O(1)。
#include<iostream>
using namespace std;
void reverseArr(int A[],int start,int rear){
while(start<rear)
{
int temp=A[start];
A[start]=A[rear];
A[rear]=temp;
start++;
rear--;
}
}
void leftCir(int A[],int n,int k){
if(k<=0 || k>=n)
cout<<"ERROR"<<endl;
else{
reverseArr(A,0,k-1);
reverseArr(A,k,n-1);
reverseArr(A,0,n-1);
}
}
void show(int A[],int n){
for(int i=0;i<n;++i)
cout<<A[i]<<" ";
cout<<endl;
}
int main()
{
int n,p;
cin>>n>>p;
int a[n];
for(int i=0;i<n;++i)
cin>>a[i];
leftCir(a,n,p);
show(a,n);
return 0;
}
2. 奇偶数排列
已知数组A[n]中的元素是整型,设计算法将其调整为左右两部分,其中左边是奇数,右边是偶数。并要求算法的时间复杂度是O(n),空间复杂度是O(1)。
提示:本题目有多种解题思路,这里统一采用如下思路:分别设置工作指针i和j,i指向数组的低地址端,j指向数组的高地址端,一旦发现左边是偶数,右边是奇数,则发生交换。
#include <iostream>
using namespace std;
void split(int A[],int n) {
int rear=n-1;
for(int i=0; i<rear; i++) {
if(A[i]%2==0&&A[rear]%2!=0) {//满足左边偶数右边奇数
int temp=A[i];
A[i]=A[rear];
A[rear]=temp;
rear--;//工作指针左移
} else if(A[i]%2==0&&A[rear]%2==0) {//左边和右边都是偶数
i--;
rear--;
} else if(A[i]%2!=0) {
continue;
}
}
}
void show(int A[],int n) {
for(int i=0; i<n; ++i)
cout<<A[i]<<" ";
cout<<endl;
}
int main() {
int n;
cin>>n;
int a[n];
for(int i=0; i<n; ++i)
cin>>a[i];
split(a,n);
show(a,n);
return 0;
}
3. 回文字符串
判断一个非空字符串是否是回文。
#include <iostream>
using namespace std;
bool judge(string str) {
int length=str.size();//求string字符串的长度
for(int i=0; i<length/2; i++) {
if(str[i]!=str[length-i-1])
return false;
}
return true;
}
int main() {
string s;
getline(cin,s);
bool res=judge(s);
if(res)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
4. 求最大值和次最大值
找出整型数组A[n]中的最大值和次最大值
#include <iostream>
using namespace std;
void getMax(int A[],int n,int &fMax,int &sMax) {
int i=0;
fMax=sMax=-100000000;//初始化为最小
if(n==1) {//数组a只有一个数
fMax=sMax=A[0];
return ;
}
for(i=0; i<n; i++) {
if(fMax<A[i])
fMax=A[i];//找最大数
}
for(i=0; i<n; i++) {
if(fMax==A[i]) {
A[i]=-1000000;//找出最大数在a中的位置。并赋值为一个极小的数
break;
}
}
for(i=0; i<n; i++) {
if(sMax<A[i])
sMax=A[i];//找出次最大值
}
}
int main() {
int n,maxV,nMax;
cin>>n;
int a[n];
for(int i=0; i<n; ++i)
cin>>a[i];
getMax(a,n,maxV,nMax);
cout<<maxV<<" "<<nMax<<endl;
return 0;
}
结语
如果你发现文章有什么问题,欢迎留言指正。
如果你觉得这篇文章还可以,别忘记点个赞加个关注再走哦。
如果你不嫌弃,还可以关注微信公众号———梦码城(持续更新中)。
梦码在这里感激不尽!!!