UVa 11988 - Broken Keyboard (a.k.a. Beiju Text)题解

UVa11988

代码仓库

11988.cc

这道题目的意思并不难理解,主要是对字符串(数组)的移动操作,对于新手来说看到题目的第一想法是对每一个"["和"]"后的字符串进行移动,完成数组的重新排列。但我们知道这种方式是不可取的,假设字符串(数组)有n个元素,每次移动第i个元素,后面的n-i个元素都需要跟着移动,当n大到一定程度的时候,移动的开销是相当大的。

所以我们其实可以去改变每一段子字符串的输出顺序,这样也可以到达和移动数组同样的效果,并且开销要少得多。

我们遍历整个字符串,使用两个int类型数组去分别标记"["和"]"后面字符串的位置,并把"["和"]"变成"\0"。由于越晚按home键的字符串会在越前面,故用以标记"["的数组需要倒序输出。

for (int i = addra_count - 1; i != -1;i--)
{
    printf("%s", str + addra[i]);
}

for (int i = 0; i != addrb_count;i++)
{
    printf("%s", str + addrb[i]);
}

使用这种方法,值得注意的一点是字符串开头如果没有"["或"]",就不会被两个数组标记到,在输出的时候就会被忽略掉。

if(str[0]!='['&&str[0]!=']')
{
    printf("%s", str);
}
posted @ 2021-03-01 21:50  ithepug  阅读(55)  评论(0编辑  收藏  举报