LeetCode17--用栈操作构建数组和整理字符串

1.用栈操作构建数组

//给你一个目标数组 target 和一个整数 n。每次迭代,需要从 list = {1,2,3..., n} 中依序读取一个数字。 
//
// 请使用下述操作来构建目标数组 target : 
//
// 
// Push:从 list 中读取一个新元素, 并将其推入数组中。 
// Pop:删除数组中的最后一个元素。 
// 如果目标数组构建完成,就停止读取更多元素。 
// 
//
// 题目数据保证目标数组严格递增,并且只包含 1 到 n 之间的数字。 
//
// 请返回构建目标数组所用的操作序列。 
//
// 题目数据保证答案是唯一的。 
//
// 
//
// 示例 1: 
//
// 
//输入:target = [1,3], n = 3
//输出:["Push","Push","Pop","Push"]
//解释: 
//读取 1 并自动推入数组 -> [1]
//读取 2 并自动推入数组,然后删除它 -> [1]
//读取 3 并自动推入数组 -> [1,3]
// 
//
// 示例 2: 
//
// 
//输入:target = [1,2,3], n = 3
//输出:["Push","Push","Push"]
// 
//
// 示例 3: 
//
// 
//输入:target = [1,2], n = 4
//输出:["Push","Push"]
//解释:只需要读取前 2 个数字就可以停止。
// 
//
// 示例 4: 
//
// 
//输入:target = [2,3,4], n = 4
//输出:["Push","Pop","Push","Push","Push"]
// 
//
// 
//
// 提示: 
//
// 
// 1 <= target.length <= 100 
// 1 <= target[i] <= 100 
// 1 <= n <= 100 
// target 是严格递增的 
// 
// Related Topics 栈
public List<String> buildArray(int[] target, int n) {
        Deque<Integer> deque = new LinkedList<Integer>();
        List<String> list = new ArrayList<>();
        int j = 0;
        for (int i = 1; i <= n; i++) {
            deque.push(i);
            list.add("Push");
            if(target[j] != i){
                deque.pop();
                list.add("Pop");
            }else {
                j++;
            }
            if(j==target.length){
                break;
            }
        }
        return list;
    }

2.整理字符串

//给你一个由大小写英文字母组成的字符串 s 。 
//
// 一个整理好的字符串中,两个相邻字符 s[i] 和 s[i+1],其中 0<= i <= s.length-2 ,要满足如下条件: 
//
// 
// 若 s[i] 是小写字符,则 s[i+1] 不可以是相同的大写字符。 
// 若 s[i] 是大写字符,则 s[i+1] 不可以是相同的小写字符。 
// 
//
// 请你将字符串整理好,每次你都可以从字符串中选出满足上述条件的 两个相邻 字符并删除,直到字符串整理好为止。 
//
// 请返回整理好的 字符串 。题目保证在给出的约束条件下,测试样例对应的答案是唯一的。 
//
// 注意:空字符串也属于整理好的字符串,尽管其中没有任何字符。 
//
// 
//
// 示例 1: 
//
// 
//输入:s = "leEeetcode"
//输出:"leetcode"
//解释:无论你第一次选的是 i = 1 还是 i = 2,都会使 "leEeetcode" 缩减为 "leetcode" 。
// 
//
// 示例 2: 
//
// 
//输入:s = "abBAcC"
//输出:""
//解释:存在多种不同情况,但所有的情况都会导致相同的结果。例如:
//"abBAcC" --> "aAcC" --> "cC" --> ""
//"abBAcC" --> "abBA" --> "aA" --> ""
// 
//
// 示例 3: 
//
// 
//输入:s = "s"
//输出:"s"
// 
//
// 
//
// 提示: 
//
// 
// 1 <= s.length <= 100 
// s 只包含小写和大写英文字母 
// 
// Related Topics 栈 字符串
public String makeGood(String s) {
        Deque<Character> deque = new LinkedList();
        String res = "";
        deque.push(s.charAt(0));
        if(s.length()==1){
            return s;
        }
        for (int i = 1; i < s.length(); i++) {
            //if(deque.size()>0 && s.charAt(i) == caps(deque.peek())){
            if(deque.size()>0 && (s.charAt(i) ^ deque.peek()) == 32){
                deque.pop();
            }else {
                deque.push(s.charAt(i));
            }
        }
        while(!deque.isEmpty()){
            res += deque.pop();
        }
        String reverse = new StringBuffer(res).reverse().toString();
        return reverse;
    }
    Character caps(Character c){
        if(Character.isLowerCase(c)){
            return Character.toUpperCase(c);
        }else{
            return Character.toLowerCase(c);
        }
    }

 

上一篇:经典算法思想之滑动窗口


下一篇:[转载]C++ STL 双端队列deque详解