之前遇到字典树什么的要不就用指针链表,要不直接上list。
数组链表主要思想和指针差不多。
指针是用*next记录下一个的地址然后形成链。
数组本身开辟空间时便是一个地址所以也可以达到这点。
比如 int a[11]; a[0]=1; a[1]=2; a[2]=4; a[4]=3;
a[a[0]]=a[1]=2这样就达到了将 1 2 4 3 接到一起。
仔细分析一下数组a的下标再不断增大,但是记录的数据却在更新。
所以可以大致写出
int next[11];
int now=0; //光标
for(int i=1;i<=n;i++)
{
next[i]=next[now]; // 更新数据
next[now]=i; // 记录位置
now++; //光标移动
}
不同题目光标跳动方式不同,现在上例题
小紫书UVA 11988
题目大意输入一串字符(空格用‘_‘代替)其中字符‘[’表示HOME建(光标移到最前面) 字符 ‘]‘ 表示END键(光标移到最后) 输出运行后的字符串(长度100000);
样例输入 This_is_a_[Beiju]_text
样例输出 BeijuThis_is_a_text
拿到题目如果字符串长度小的话可以直接暴力模拟。
不过字符串长为100000的话如果插入一个数到最前面后面的都要往后移动这样时间量就大了(系统不想跟你说话同时丢给你一个TLE)
所以要用到链表
不同的是光标可能跳到最前面或者最后面所以要设一个变量记录当前最后的位置
代码如下
#include<stdio.h>
#include<string.h>
#define Max 100000
int main()
{
char s[Max+5];
int next[Max+5];
int now;
while(~scanf("%s",s+1)) //从第1位开始保留0位作为起始
{
memset(next,0,sizeof(next));
int i,ed=0; //设置当前最后位置为0
now=0; //初始化光标
for(i=1;i<=strlen(s+1);i++)
{
if(a[i]==‘[‘) now=0; //光标移至最前
else if(a[i]==‘]‘) now=ed; //光标移至最后
else {
next[i]=next[now]; //更新next数组
next[now]=i;
if(ed==now) ed=i; //更新末位
now=i; //更新光标
}
for(i=next[0];i!=0;i=next[i])
printf("%c",s[i]);
printf("\n");
]
}