Fancy

专门记录一点思维题。

1. 反转与双端队列:LC 2810 故障键盘

这题是个easy,但用StringBuilder强行模拟反转就没意思了。

可以这么想,当打出一个i,代表一个控制信号,反转。

一开始我们向队列尾部(屏幕上的输出)拼接字符。但一旦反转了,我们就在队列首部拼接字符,再反转就再在尾部拼接。

import java.util.ArrayDeque;
import java.util.ArrayList;

class Solution {
    public String finalString(String s) {
        char[] ch = s.toCharArray();
        ArrayList dq = new ArrayList();
        boolean tail = true;
        for (char c : ch) {
            if(c=='i'){
                tail = !tail;
                continue;
            }
            if(tail){
                dq.add(c);
            }else{
                dq.add(0,c);
            }
        }
        StringBuilder sb = new StringBuilder();
        if(tail){
            for (int i = 0; i < dq.size(); i++) {
                sb.append(dq.get(i));
            }
        }else{
            for (int i = dq.size()-1; i >= 0; i--) {
                sb.append(dq.get(i));
            }
        }
        return sb.toString();
    }
}

2. 剥洋葱:LC 2811 判断是否能拆分数组

1和2都来自周赛357,质量挺高,但可惜我摆了没打(

这题观察到一个性质就秒杀:如果有一个长度恰好为2的子数组的元素和≥m,那么就可以成功。

例如:

[ 1,1,1,1,2,2,1,1 ] m = 4

我们可以发现有个[2,2]的子数组,既然它已经满足了元素和≥4,那么它带上它左边或右边的一段子数组,依然可以满足,因为每个元素都是≥0的。比如说我们可以把这个东西拆成:

[1]
[ 1,1,1,2,2,1,1]

然后这样从前从后一直拆,类似于剥洋葱,拆到[2,2]也没问题,再把[2,2]拆了就行。

所以就是说,当数组的长度>2的时候,如果有两个相邻的数之和≥m。就能成。

import java.util.List;

class Solution {
    public boolean canSplitArray(List nums, int m) {
        if(nums.size()<=2){
            return true;
        }

        for (int i = 0; i < nums.size()-1; i++) {
            if(nums.get(i)+nums.get(i+1)>=m){
                return true;
            }
        }
        
        return false;
    }
}

你可能感兴趣的:(数据结构与算法,leetcode,算法,数据结构,java)