Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述:
撤销/恢复操作具有广泛的用途,比如word文档中输入一个单词,可以点撤销,然后可以再恢复。 编程实现如下功能: 从标准输入读取到一个字符串,字符串可包含0个或多个单词,单词以空格或者tab分隔; 如果遇到 "undo" 字符串,表示"撤销"操作,前一个字符串被撤销掉; 如果遇到"redo"字符串,表示恢复刚才撤销掉的字符串. 例如: 输入字符串 "hello undo redo world.", 对字符串中的 undo 和 redo 处理后, 最终输出的结果为 "hello world."
输入描述:
一行字符串: 包含0个或多个单词,单词以空格或者tab分隔
输出描述:
一行字符串: 由0个或多个单词组成,单词以空格分隔
输入例子1:
hello undo redo world.
输出例子1:
hello world.
二、思路分析:
这道题我首先想到的是使用临时变量把撤销的单词存起来,然后恢复的时候再拿回来就可以了,但仔细一想,如果有多次撤销操作呢。
于是我想到使用两个栈,如果是单词就往栈1里面push,当遇到undo命令时就将栈顶单词取出放到栈2中去,遇到redo命令时就从栈2中取栈顶push到栈1中去,相当于恢复。
最后清空栈2,再将栈1元素取出push到栈2中,后进先出,就可以输出正确顺序的单词了。
其中要注意的就是如果执行undo后如果再新增了单词,那么redo就无法执行了,要清空栈2.
三、AC 代码:
import java.util.Scanner;
import java.util.Stack;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String[] sarr = str.split(" ");
Stack<String> stack = new Stack<>();
Stack<String> tempStack = new Stack<>();
for(String s:sarr){
if(s.equals("undo")){
if(!stack.isEmpty()){
tempStack.push(stack.pop());
}
}else if(s.equals("redo") && !tempStack.isEmpty()){
stack.push(tempStack.pop());
}else{
stack.push(s);
tempStack.clear();
}
}
tempStack.clear();
while(!stack.isEmpty()){
tempStack.push(stack.pop());
}
while(!tempStack.isEmpty()){
System.out.print(tempStack.pop()+" ");
}
}
}
总结
本题利用栈的后进先出,实现了字符的撤销、恢复,但是不知道这题的具体要求是啥,能不能在新增单词后恢复被撤销的单词不确定,所以我提交的时候5组用例过了2组,也没法查看用例,难受,但是大概思路应该是不会错,如果你有更好的解法欢迎评论区留言讨论。