专门记录一点思维题。
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<Character> dq = new ArrayList<Character>();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<Integer> 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;}
}