1

我遇到了一个简单的(如我所想的)旋转字符串练习:

将字符串旋转K个字符意味着将这些字符从开头剪切并转移到结尾。如果 K 为负数,则相反,字符应从末尾转移到开头。

我立即发明了使用两个子字符串连接的解决方案。但是,我发现了以下补充:

如果您想要更严峻的挑战,我们鼓励您“就地”进行轮换

任务来自这里- 确保这不是我的大学作业等

我看不到任何简单的方法来做到这一点(我想应该有 O(N) 算法)。如果我将第 0 个字符复制到临时变量并将第 K 个字符复制到它的位置,然后将第 2K 个字符复制到第 K 个的位置等等 - 如果 K 和字符串长度是互质的,我将成功。我想我可以管理其他 Ks 添加外部循环以重复从第 1 个字符到第 2 个字符的过程 - 我认为最多 GCD(K, strlen(S))

但它看起来太笨拙了。

4

1 回答 1

5

让我们看一下将其旋转 6 个字符:

Original: 123456789
Desired:  789 123456

现在看看当我们反转所需字符串的两个部分时会发生什么:

987 654321

这只是原始字符串的反面。

所以,我们需要做的是先反转字符串,然后反转两个部分。

在线性时间内就地反转字符串很容易。

这是最近提出的另一个问题的副本,回答它似乎比找到副本更省力 - 我只会制作这个社区维基。

于 2013-10-11T10:57:59.350 回答