2023-1-12 刷题情况

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<=4104
  • 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”

解释:

  1. 键 “name” 对应的值为 “bob” ,所以将 “(name)” 替换为 “bob” 。
    键 “age” 对应的值为 “two” ,所以将 “(age)” 替换为 “two” 。
  2. 由于不知道键 “name” 对应的值,所以用 “?” 替换 “(name)”
  3. 相同的键在 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 只包含小写英文字母。 keyivaluei只包含小写英文字母。
  • 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) : "?";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值