Java用Stack反转字符串遇问题:测试用例全失败求排查
问题分析与修正
核心错误原因
你的代码中Stack<Character> s1和s2是类的成员变量,而非reverse()方法内的局部变量。这意味着每次调用reverse()方法时,栈不会被重置,之前调用残留的元素会被保留,导致后续的字符串反转结果完全错误。
冗余逻辑优化
另外,你使用两个栈实现反转是多余的。栈的特性是后进先出,直接从栈中弹出元素拼接成字符串,就已经是反转后的结果,不需要转存到第二个栈。
修正后的代码
class Solution { public String reverse(String S){ StringBuilder temp = new StringBuilder(); Stack<Character> stack = new Stack<>(); // 将字符串所有字符压入栈 for(int i=0;i<S.length();i++){ stack.push(S.charAt(i)); } // 弹出栈中元素,直接拼接成反转字符串 while(!stack.isEmpty()){ temp.append(stack.pop()); } return temp.toString(); } }
额外优化说明
- 用
StringBuilder代替字符串直接拼接:字符串是不可变对象,每次temp=temp+s2.pop()都会创建新字符串对象,时间复杂度会升至O(N²),而StringBuilder的append方法是均摊O(1),符合题目要求的O(N)时间复杂度。 - 仅使用一个栈:简化逻辑,减少不必要的内存占用,同时满足题目要求的O(N)辅助空间。
内容的提问来源于stack exchange,提问作者Ninad Walanj
相关产品推荐
相关产品推荐

