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

时间:2019-04-09 13:41:53

标签: java arrays rotation

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

例如将“字符串”争夺为“ srintg”

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

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

我想获得输出“ srintg”,但我将获得“ rintgs”。

1 个答案:

答案 0 :(得分:0)

假设您的单词足够长,足以使其有意义(至少四个字母),则可以通过旋转列表的子列表来使呈现的方法有效:

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

List.subList()创建List列表一部分的视图,其确切目的是避免需要对在元素的索引子范围上运行的版本重载List方法。从快速书写的意义上讲,这是“快速的”,这很明显。

但是,如果您在性能上追求“快速”,那么分割和连接字符串似乎是不明智的。我们无法提供Fast est ,因为需要对性能进行测试,但是如果我要寻找最佳性能,那么我将至少测试以下常规方法:

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