1.回文字符串
判断一个非空字符串是否是回文。
#include <iostream>
using namespace std;
bool judge(string str){
int length=str.length();
for(int i=0;i<length/2;i++)
{
if(str[i]!=str[length-1-i])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;
}
2.奇偶数排列
已知数组A[n]中的元素是整型,设计算法将其调整为左右两部分,其中左边是奇数,右边是偶数。并要求算法的时间复杂度是O(n),空间复杂度是O(1)。
提示:本题目有多种解题思路,这里统一采用如下思路:
分别设置工作指针i和j,i指向数组的低地址端,j指向数组的高地址端,一旦发现左边是偶数,右边是奇数,则发生交换。
#include <iostream>
using namespace std;
void split(int A[],int n){
int *_begin=A;
int *_end=A+n-1;
int tmp;
while(_begin<_end)
{
if((*_begin)%2)_begin++;
else if((*_end)%2==0)_end--;
else {
tmp=*_begin;
*_begin=*_end;
*_end=tmp;
}
}
}
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.循环左移
将一个具有 n 个元素的数组A[n]向左循环移动k个位置,要求时间复杂度为O(n),空间复杂度为O(1)。
#include <iostream>
using namespace std;
void reverseArr(int A[],int start,int rear){
int i,j;
int temp;
for(i=start,j=rear;i<j;++i,--j)
{
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
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;
}
4.求最大值和次最大值
找出整型数组A[n]中的最大值和次最大值
#include <iostream>
using namespace std;
void getMax(int A[],int n,int &fMax,int &sMax){
int inf=0xffffff;
fMax=-inf;
sMax=-inf;
for(int i=0;i<n;i++)
{
if(A[i]>fMax)fMax=A[i];
}
int cnt=0;
for(int i=0;i<n;i++)
{
if(A[i]==fMax)cnt++;
if(A[i]>sMax&&A[i]!=fMax)sMax=A[i];
}
if(cnt>1)sMax=fMax;
}
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;
}