数据结构(绪论)

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


结语

如果你发现文章有什么问题,欢迎留言指正。
如果你觉得这篇文章还可以,别忘记点个赞加个关注再走哦。
如果你不嫌弃,还可以关注微信公众号———梦码城(持续更新中)。
梦码在这里感激不尽!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦码城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值