只旋转数组中某些元素的最快方法是什么?



我正在为字符串编写一种单词扰频器的形式,它接受除第一个和最后一个字母之外的所有字母,并旋转它们的位置。但是,我应该只看倒数第二的字母。我应该如何只从倒数第二个字母到倒数第二个字母?

例如,将"字符串"加扰为"srintg">

我可以在通过拆分字符串创建的字符数组上调用 Collections.rotate(),但这会使整个单词打乱。

List<String> newWordList = Arrays.asList(word.split(" "));
Collections.rotate(newWordList, -1);
String newWord = String.join("", newWordList);

我想获得输出"srintg",但相反,我会得到"rintgs"。

如果你的单词足够长,以至于它很合理(至少四个字母),你可以通过旋转列表的子列表来使你呈现的方法起作用:

Collections.rotate(newWordList.subList(1, newWordList.size() - 1), -1);

List.subList()创建List列表的一部分的视图,其确切目的是避免使用对元素的索引子范围进行操作的版本重载List方法。 这是写得快的意义上的"快",而且相当清楚。

但是,如果您正在寻找性能意义上的"快速",那么拆分和连接字符串似乎是不明智的。 Fastest可能不是我们可以提供的,因为性能需要测试,但如果我正在寻找最佳性能,那么我至少会测试这些通用方法:

  • 使用单词的数组形式
    1. 使用String.toCharArray()以数组形式获取单词的字母。
    2. 使用索引for循环旋转数组中的字符。
    3. 从修改后的数组构造新String(使用适当的构造函数)。
  • 使用StringBuilder组合单词
    1. 创建初始容量等于字长的StringBuilder
    2. 使用CharacterIterator遍历单词的字母,按所需的顺序将它们附加到构建器中。 这可以通过一次通过完成。
    3. 从生成器获取结果字符串。

相关内容

最新更新