安徽大学2021考研数据结构算法设计题记录

害  复习不完了  安大太卷了

这数据结构题也没答案....写一个大家讨论讨论,记得留言

 

 题目按照我自己的理解是从B中找到符合条件的点放到A中对应的位置;时间复杂度要求O(m+n),那么可以用两个指针分别扫描A,B两个三元组表;每次在B中找到一个符合条件的结点后,就用pa扫描A找到合适的位置去存放;即可.(会不会是我题意理解错了...)

伪代码如下

 Code:

int pa=1;
void fun(TsMatrix A,TsMatrix B)
{
	for(int pb=1;pb<=n;pb++)//遍历B三元组表,找到大于x的结点 
	{
		if(B.data[pb].e>x)
		{
			while(pa<=m)//用指针pa遍历A三元组表找到对应的位置存放B中的结点 
			{
				if(A.data[pa].i==B.data[pb].i&&A.data[pa].j==B.data[pb].j)
				{
					A.data[pa].e=B.data[pb].e;
					break;
				}
				pa++;
			}
		} 
		
	}
}


 思路:

关键点:递归,不增设任何串和字符的临时存储空间

因为是在递归的时候输入,所以要想边输入边反转字符是很困难的,所以要等递归输入完成后再反转;那么问题来了,如何在不增设任何串和字符的临时存储空间的情况下反转呢?交换两个字符一定要有中间临时变量来过渡,既然不让增设空间,那就用输入的最后一个字符" $ " 来进行过渡;

增设两个指针(指针没说不让用哈),在输入完成后,递归回溯的时候,进行交换即可;注意一些细节比如设置标志位防止反转完成后字符串仍然受未完成的递归分支影响;(考试的时候应该不用注意这些细节吧wuwuwuwu......)

Code:

#include <bits/stdc++.h>
using namespace std;
int len,lf,flag;//字符串长度len,指针lf,标志位flag 
#define maxsize 1000
char A[maxsize];
void fun(char A[],int rear)
{
	
	len=rear;
	scanf("%c",&A[rear]);
	if(A[rear]=='$') return;//递归读取到最后一位"$"结束 
	 
	fun(A,rear+1);
	
	if(lf>=rear&&!flag)//此时除了第一位和最后一位之外其他字符全部反转完成; 
	{
		A[len]=A[0],A[0]='$';
		flag=1;
		return ;
	}
	
	if(flag) return ;//当回溯的时候字符串已经反转完成,则递归分支结束 
	
	A[len]=A[lf];//将最后一位"$"作为交换字符的过渡变量 
	A[lf]=A[rear];
	A[rear]=A[len];
	lf++;
}
int main()
{
	lf=1;//左边的指针从字符串的第二位开始; 
	fun(A,0);
	cout <<A<<endl;
	return 0;
}
//abcdef$

不想奋斗了...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值