365天挑战LeetCode1000题——Day 007 双周赛 LeetCode专场 01


前言

又是被简单题暴打的一天……
今天没啥时间刷LeetCode,一直在肝爬虫的实验,总算是做了个七七八八,就差预测股票最后一个小部分了,预计明天早上能做出来,明天把实验报告写完,周三检查完就发出来吧……
扯远了哈,回到正题……


1. 找到一个数字的 K 美丽值

一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目:

子字符串长度为 k 。
子字符串能整除 num 。
给你整数 num 和 k ,请你返回 num 的 k 美丽值。

注意:

允许有 前缀 0 。
0 不能整除任何值。
一个 子字符串 是一个字符串里的连续一段字符序列。

1.1 遍历

class Solution {
public:
    int divisorSubstrings(int num, int k) {
        string stringNum = to_string(num);
        int n = stringNum.size();
        int ans = 0;
        for (int i = 0; i < n - k + 1; i++) {
            string tmp = stringNum.substr(i, k);
            int tmpNum = stoi(tmp);
            if (tmpNum == 0) continue;
            if (num % tmpNum == 0) ans++;
        }
        return ans;
    }
};

2. 分割数组的方案数

给你一个下标从 0 开始长度为 n 的整数数组 nums 。
如果以下描述为真,那么 nums 在下标 i 处有一个 合法的分割 :

前 i + 1 个元素的和 大于等于 剩下的 n - i - 1 个元素的和。
下标 i 的右边 至少有一个 元素,也就是说下标 i 满足 0 <= i < n - 1 。
请你返回 nums 中的 合法分割 方案数。

2.1 动态规划

从左、右扫描,更新前缀和与后缀和,然后再遍历一遍……

class Solution {
public:
    int waysToSplitArray(vector<int>& nums) {
        int n = nums.size();
        if (n == 1) return 0;
        vector<long long> left(n);
        left[0] = nums[0];
        vector<long long> right(n);
        right[n - 1] = nums[n - 1];
        left[0] = nums[0];
        int ans = 0;
        for (int i = 1; i < n - 1; i++) {
            left[i] = nums[i] + left[i - 1];
        }
        for (int i = n - 2; i >= 1; i--) {
            right[i] = nums[i] + right[i + 1];
        }
        for (int i = 0; i < n - 1; i++) {
            if (left[i] >= right[i + 1]) ans++;
        }
        return ans;
    }
};

总结

昨天晚上的双周赛半个小时写出了前面两题,又卡在了第三题……最后答案对了,但是超时,只过了80%的案例,唉……
今天得早点睡觉,明天早起看球……
明天预计把遗留的两道题想出来就差不多了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值