害 复习不完了 安大太卷了
这数据结构题也没答案....写一个大家讨论讨论,记得留言
题目按照我自己的理解是从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$
害
不想奋斗了...