Leetcode 第30场双周赛题解

5177. 转变日期格式

思路:首先将date拆分,然后提取出年月日信息即可。

class Solution {

    String[] s={"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

    public String reformatDate(String date) {

        String[] ss = date.split(" ");
        StringBuilder str = new StringBuilder();

        str.append(ss[2]);
        str.append('-');
        for (int i = 0; i < 12; i++)
            if (ss[1].equals(s[i])) {
                if (i + 1 < 10) str.append('0');
                str.append(String.valueOf(i + 1));
                break;
            }

        str.append('-');

        int len = ss[0].length() - 2;
        
        if(len<2) str.append('0');
        str.append(ss[0].substring(0, len));

        return str.toString();

    }
}

5445. 子数组和排序后的区间和

思路:n只有1000这么大,直接暴力法求出所有子数组的和即可。

class Solution {
    public int rangeSum(int[] nums, int n, int left, int right) {

        long ans = 0;
        List list = new ArrayList<>();

        long[] sum = new long[n + 1];
        for (int i = 1; i <= n; i++)
            sum[i] = sum[i - 1] + nums[i - 1];

        for (int i = 0; i <= n; i++)
            for (int j = 0; j < i; j++)
                list.add(sum[i] - sum[j]);

        Collections.sort(list);

        for (int i = left - 1; i < right; i++)
            ans = (ans + list.get(i)) % 1000000007;

        return (int) ans;

    }
}

5446. 三次操作后最大值与最小值的最小差

思路:首先要对数组排序是肯定的,你只能修改最多三个元素,而清晰的是,你修改中间元素是没有意义的,因为不会影响最大最小值的差,因此你需要修改的一定是数组边界的值,例如你将最小的数修改为第二小的数等等,我的方法是暴力修改前i个最小数和3-i个最大的数,然后取出最小值。

class Solution {
    public int minDifference(int[] nums) {

        if (nums.length <= 3)
            return 0;

        Arrays.sort(nums);

        int len = nums.length;

        int ans = nums[len - 1] - nums[0];

        for (int i = 0; i <= 3; i++)
            ans = Math.min(ans, nums[len - 1 - i] - nums[3 - i]);

        return ans;

    }
}

5447. 石子游戏 IV

思路:对于博弈类问题来说,玩家双方当前所采取的的步骤一定是尽量让对方面临必输态。什么是必输态呢?例如n=5时,不管先手取1个还是取4个都会输,因此我们考虑从小到大遍历过去,而1个石子和2个石子我们是可以确定输赢结果的。在我的方法中dp[i]=0表示石子数量为i时玩家是必输态。

class Solution {
    public boolean winnerSquareGame(int n) {

        if (n <= 2)
            return n == 1 ? true : false;

        int[] dp = new int[n + 1];

        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            int num = 1;
            for (int j = 1; j <= (int) Math.sqrt(i); j++) 
                num = Math.min(num, dp[i - j * j]);
            dp[i] = 1 - num;
        }

        return dp[n] == 1 ? true : false;

    }
}

 

你可能感兴趣的:(Leetcode 第30场双周赛题解)