1.可被三整除的最大和
题目描述
给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。
2.测试用例
输入:
nums = [3,6,5,1,8]
nums = [4]
nums = [1,2,3,4,4]
输出:
18
0
12
解释:
选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。
4 不能被 3 整除,所以无法选出数字,返回 0。
选出数字 1, 3, 4 以及 4,它们的和是 12(可被 3 整除的最大和)。
提示
- 1 < = n u m s . l e n g t h < = 4 ∗ 1 0 4 1 <= nums.length <= 4 * 10^4 1<=nums.length<=4∗104
- 1 < = n u m s [ i ] < = 1 0 4 1 <= nums[i] <= 10^4 1<=nums[i]<=104
3.思路
还是可以将一个划分为多个子问题,且当前状态可由上一个阶段的状态推导而来。即可使用动态规划。
4.算法实现
class Solution {
public int maxSumDivThree(int[] nums) {
int n = nums.length;
int[][] dp = new int[n+1][3];
dp[0][0] = 0;
// 初始余数为1,与余数为二的最大值必须为负数,不然回影响到最终结果,debug半天得出的结论
dp[0][1] = Integer.MIN_VALUE;
dp[0][2] = Integer.MIN_VALUE;
for (int i = 1; i <= n; i++) {
for(int j = 0; j < 3; j++){
// 当前状态只与上一个阶段的值相关,可进行状态压缩,但当前阶段的值又一直相互影响,状态压缩实现起来还是有点麻烦
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][(j+3-nums[i-1] % 3)%3] + nums[i-1]);
}
}
return dp[n][0];
}
}
2.替换字符串中的括号内容
题目描述
给你一个字符串 s ,它包含一些括号对,每个括号中包含一个 非空 的键。
比方说,字符串 “(name)is(age)yearsold” 中,有 两个 括号对,分别包含键 “name” 和 “age” 。
你知道许多键对应的值,这些关系由二维字符串数组 knowledge 表示,其中 knowledge[i] = [keyi, valuei] ,表示键 keyi 对应的值为 valuei 。
你需要替换 所有 的括号对。当你替换一个括号对,且它包含的键为 keyi 时,你需要:
将 keyi 和括号用对应的值 valuei 替换。
如果从 knowledge 中无法得知某个键对应的值,你需要将 keyi 和括号用问号 “?” 替换(不需要引号)。
knowledge 中每个键最多只会出现一次。s 中不会有嵌套的括号。
请你返回替换 所有 括号对后的结果字符串。
2.测试用例
输入:
s = “(name)is(age)yearsold”, knowledge = [[“name”,“bob”],[“age”,“two”]]
s = “hi(name)”, knowledge = [[“a”,“b”]]
s = “(a)(a)(a)aaa”, knowledge = [[“a”,“yes”]]
输出:
“bobistwoyearsold”
“hi?”
“yesyesyesaaa”
解释:
- 键 “name” 对应的值为 “bob” ,所以将 “(name)” 替换为 “bob” 。
键 “age” 对应的值为 “two” ,所以将 “(age)” 替换为 “two” 。- 由于不知道键 “name” 对应的值,所以用 “?” 替换 “(name)”
- 相同的键在 s 中可能会出现多次。
键 “a” 对应的值为 “yes” ,所以将所有的 “(a)” 替换为 “yes” 。
注意,不在括号里的 “a” 不需要被替换。
提示
- 1 <= s.length <= 10^5
- 0 <= knowledge.length <= 10^5
- knowledge[i].length == 2
- 1 <= keyi.length, valuei.length <= 10
- s 只包含小写英文字母和圆括号 ‘(’ 和 ‘)’ 。
- s 中每一个左圆括号 ‘(’ 都有对应的右圆括号 ‘)’ 。
- s 中每对括号内的键都不会为空。
- s 中不会有嵌套括号对。
- k e y i 和 v a l u e i 只包含小写英文字母。 key_i 和 value_i 只包含小写英文字母。 keyi和valuei只包含小写英文字母。
- k n o w l e d g e 中的 k e y i 不会重复。 knowledge 中的 key_i 不会重复。 knowledge中的keyi不会重复。
3.思路
直接map模拟
4.算法实现
class Solution {
HashMap<String, String> map;
public String evaluate(String s, List<List<String>> knowledge){
map = new HashMap<String, String>();
for(List<String> list : knowledge) map.put(list.get(0), list.get(1));
String ans = "";
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) == '('){
int j = i;
while(j < s.length() && s.charAt(j) != ')') j++;
ans += judge(s.substring(i+1, j));
i = j;
}
else ans += s.charAt(i);
}
return ans;
}
private String judge(String s){
return map.containsKey(s) ? map.get(s) : "?";
}
}