数据结构第一章 绪论

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值