
本文介绍如何用java高效生成一个字符串的所有循环旋转版本,即从每个索引开始、绕回开头继续取字符,最终得到与原字符串等长的n个新字符串。
本文介绍如何用java高效生成一个字符串的所有循环旋转版本,即从每个索引开始、绕回开头继续取字符,最终得到与原字符串等长的n个新字符串。
在处理动态字符串(如数字序列 "13579" 或 "12345789")时,常需生成其全部循环旋转(circular rotations)——即以每个位置为起点,依次向后取字符,当到达末尾时自动回到开头,直至取满原字符串长度。例如,对 "13579"(长度为5),应输出:
13579 35791 57913 79135 91357
这类需求常见于密码学、字符串匹配预处理或算法题训练中。关键在于避免 StringIndexOutOfBoundsException,同时保持逻辑简洁、可复用。
✅ 推荐方案:模运算(Modulo-based Indexing)
最直观、健壮且通用的方法是使用 % 模运算控制索引循环。对于字符串 s 和起始位置 start,第 i 个字符(i 从 0 到 n-1)对应原串索引为 (start + i) % n。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
以下是完整、可直接运行的 Java 示例:
import java.util.Scanner;
public class StringRotations {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入字符串(仅数字):");
String s = sc.nextLine().trim();
if (s.isEmpty()) {
System.out.println("输入不能为空!");
return;
}
int n = s.length();
// 生成 n 个旋转字符串:从索引 0, 1, ..., n-1 开始
for (int start = 0; start <p><strong>输出示例(输入 "13579"):</strong> </p><pre class="brush:php;toolbar:false;">13579
35791
57913
79135
91357⚠️ 注意事项与优化建议
- 不要硬编码数字拼接逻辑:原始代码中尝试用数学运算(如 num * 10 + firstDigit)处理整数旋转,虽可行但仅适用于纯数字且易受前导零影响(如 "0123" → 123 会丢失首位),而字符串方案天然支持任意字符(含 '0'、字母、符号)。
- 避免 String.concat() 频繁拼接:在循环内用 + 或 concat() 构建字符串效率低;推荐使用 StringBuilder(如上例),时间复杂度从 O(n³) 降至 O(n²)。
- 边界防护:% 运算天然保证索引 ∈ [0, n-1],彻底规避 IndexOutOfBoundsException,无需额外 if 判断。
- 扩展性:该方法完全不依赖字符串内容类型,适用于任意 String(如 "abc", "A1!x"),真正“通用”。
✅ 总结
生成字符串所有循环旋转的核心在于:将线性索引映射为环形坐标。借助 (start + i) % length,即可优雅、安全、高效地实现任意长度字符串的全旋转枚举。此模式简洁清晰、易于理解与维护,是 Java 字符串循环操作的标准实践。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










