一. 分割平衡字符串
在一个「平衡字符串」中,‘L’ 和 ‘R’ 字符的数量是相同的。
给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。
返回可以通过分割得到的平衡字符串的最大数量。
输入:s = “RLRRLLRLRL”
输出:4
解释:s 可以分割为 “RL”, “RRLL”, “RL”, “RL”, 每个子字符串中都包含相同数量的 ‘L’ 和 ‘R’。
public int balancedStringSplit(String s) {
int count = 0; //来记录每次的更新
int amount = 0; //记录最大分割数
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
//无论看见'L'++还是'R'-- 最终都会相互匹配 算一次。
if(c == 'R'){
count++;
}
if(c == 'L'){
count--;
}
if(count == 0){
amount++;
}
}
return amount;
}
}
二.玩筹码
数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中。
你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以):
将第 i 个筹码向左或者右移动 2 个单位,代价为 0。
将第 i 个筹码向左或者右移动 1 个单位,代价为 1。
最开始的时候,同一位置上也可能放着两个或者更多的筹码。
返回将所有筹码移动到同一位置(任意位置)上所需要的最小代价。
输入:chips = [1,2,3]
输出:1
解释:第二个筹码移动到位置三的代价是 1,第一个筹码移动到位置三的代价是 0,总代价为 1。
public int minCostToMoveChips(int[] chips) {
//看奇数多还是偶数多,少的就是答案.
//谁多选谁为基准就是移动2的代价,少的就是移动1的代价.
int evenNumber = 0; //偶数个数
int oddNumber = 0; //奇数个数
for(int i = 0; i < chips.length; i++){
if(chips[i] % 2 == 0){
evenNumber++;
}else{
oddNumber++;
}
}
return (evenNumber >= oddNumber)? oddNumber:evenNumber;
}
三.最长定差子序列
给你一个整数数组 arr 和一个整数 difference,
请你找出 arr 中所有相邻元素之间的差等于给定 difference 的等差子序列,并返回其中最长的等差子序列的长度。
输入:arr = [1,2,3,4], difference = 1
输出:4
解释:最长的等差子序列是 [1,2,3,4]。
public int longestSubsequence(int[] arr, int difference) {
int result = 1; //他每次都会多一个,提前加1.
Map<Integer, Integer> map = new HashMap<>();
for(int i : arr){
int tem = map.getOrDefault(i - difference, 0) + 1; //获取之前的存好的map值,没有就设置为1.有值就说明前面有一个满足的.获取到他的值 + 1存到这个map里,供下次遍历.
map.put(i, tem);
result = Math.max(result, tem);
}
return result;
}
}