
本文详解java中通过双指针法实现字符串单词顺序反转的原理与实现,重点剖析原代码中因边界处理不当导致的空格错位问题,并提供修正方案与完整可运行示例。
本文详解java中通过双指针法实现字符串单词顺序反转的原理与实现,重点剖析原代码中因边界处理不当导致的空格错位问题,并提供修正方案与完整可运行示例。
在Java中对用户输入的字符串进行“单词级反转”(即保持每个单词内部字符顺序不变,仅反转单词整体的排列顺序),是一个经典算法题。例如输入 "I like ice cream!",期望输出为 "cream! ice like I"。这不同于简单地反转整个字符串(如 new StringBuilder(s).reverse()),而是需分三步完成:逐词反转 → 整体反转 → 处理边界。
原代码采用双指针原地操作方式,核心逻辑位于 reverseWords 方法中:
static char[] reverseWords(char[] s) {
int start = 0;
for (int end = 0; end <p>其中 reverse(char[] str, int start, int end) 是基础翻转函数,它将 str 中下标 [start, end] 范围内的字符原地交换:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java"><img
src="https://img.php.cn/upload/skill/000/000/081/178955835420587.jpg" alt="Alibabacloud Sdk Client Initialization For Java" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java" class="overflowclass">Alibabacloud Sdk Client Initialization For Java</a>
<p class="overflowclass">在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。</p>
</div>
<a rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><pre class="brush:php;toolbar:false;">static void reverse(char str[], int start, int end) {
while (start <p>⚠️ <strong>关键问题解析</strong>:<br>
原代码中 reverse(s, start, end) 被错误地调用在 s[end] == ' ' 时,此时 end 指向空格位置。若直接传入 end,则反转范围包含该空格,导致第一个字母与空格交换(如 "I " 中 'I' 和 ' ' 互换,变成 " I"),严重破坏结果。<strong>正确做法是传入 end - 1,确保只反转单词内部字符</strong>。</p><p>此外需注意变量作用域:reverse 方法中的 start 和 end 是形参,其修改<strong>完全独立于 reverseWords 中同名变量</strong>——这是Java值传递机制决定的,不会产生副作用。可通过添加调试语句验证:</p><pre class="brush:php;toolbar:false;">System.out.println("Before reverse: end=" + end);
reverse(s, start, end - 1);
System.out.println("After reverse: end=" + end); // 值不变✅ 完整可运行修正版代码如下:
import java.util.Scanner;
public class StringReversal {
static void reverse(char str[], int start, int end) {
while (start <p><strong>运行示例</strong>:<br>
输入:I like ice cream!<br>
输出:cream! ice like I</p><p>? <strong>总结要点</strong>: </p>
- 单词级反转 = 局部反转(各单词内) + 全局反转(单词序列);
- 边界判断必须严格:空格索引 end 不属于单词,反转右界应为 end - 1;
- 原地算法高效(O(1) 空间复杂度),但需谨慎处理索引越界与循环终止条件;
- 所有方法内变量均为局部作用域,跨方法同名变量互不影响。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










