頭條實習筆試題
阿新 • • 發佈:2019-01-07
題目
對於一段字串,i代表刪除一個字元,o代表撤銷上次操作(可能是輸入,可能是刪除)
求最後的字串
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; public class Main { public static void main(String[] args) throws Exception{ BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); char[] chars = bf.readLine().toString().toCharArray(); ArrayList<Character> list = new ArrayList<Character>(); //int[] ints = new int[chars.length]; // for(int i = 0; i < ints.length; i++) { // ints[i] = -1; // } int flag = 0; char c = '0'; for(int i = 0; i < chars.length; i++) { if(chars[i] != 'i' & chars[i] != 'o') { list.add(chars[i]); flag = 1; c = chars[i]; }else if(chars[i] == 'i'){ c = list.get(list.size() - 1); flag = -1; list.remove(list.size() - 1); }else { if(flag == 1) { list.remove(list.size() - 1); }else { list.add(c); } } } for(char a : list) { System.out.print(a); } } }
思路
其實最主要是利用棧的思想
遍歷一遍字串,碰到普通字元時,入棧;碰到i(刪除操作)時,棧頂出棧;
這裡關鍵時碰到o之後的操作,撤銷操作說白了就是刪除一個字元或者一個字元入棧;
刪除字元簡單,和碰到i之後的操作一樣
但是入棧需要入的是上次刪除時的字元,所以這裡需要一個快取區記錄下每次刪除時刪除的字元,當然只需要記錄最近的一次就可以了,o入棧的字元就是存在這個快取區的字元
可惜筆試時沒想到,一直想的用陣列記錄,可是會亂,而且很複雜。