文章目录
前言
又是被简单题暴打的一天……
今天没啥时间刷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%的案例,唉……
今天得早点睡觉,明天早起看球……
明天预计把遗留的两道题想出来就差不多了。