UVA 11988 链表
2016-05-10 20:42
211 查看
之前遇到字典树什么的要不就用指针链表,要不直接上list。
数组链表主要思想和指针差不多。
指针是用*next记录下一个的地址然后形成链。
数组本身开辟空间时便是一个地址所以也可以达到这点。
比如 int a[11]; a[0]=1; a[1]=2; a[2]=4; a[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");
]
}
数组链表主要思想和指针差不多。
指针是用*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");
]
}
相关文章推荐
- [C/C++]反转链表
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#实现基于链表的内存记事本实例
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#模拟链表数据结构的实例解析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总