1. 程式人生 > >頭條實習筆試題

頭條實習筆試題

 題目

對於一段字串,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入棧的字元就是存在這個快取區的字元

 

可惜筆試時沒想到,一直想的用陣列記錄,可是會亂,而且很複雜。