leetcode解题思路分析(一百六十七)1445 - 1451 题
- 连续字符
给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。请你返回字符串 s 的 能量。
直接遍历一遍即可。
class Solution {
public:int maxPower(string s) {int ret = 0;if (s.empty()) { return ret; }char curr = s[0];int curr_continue = 1;ret = 1;for (int i = 1; i < s.size(); ++i) {if (s[i] == curr) {curr_continue++;ret = max(ret, curr_continue);} else {curr = s[i];curr_continue = 1;}}return ret;}
};
- 最简分数
给你一个整数 n ,请你返回所有 0 到 1 之间(不包括 0 和 1)满足分母小于等于 n 的 最简 分数 。分数可以以 任意 顺序返回。
暴力解题
class Solution {
public:vector<string> simplifiedFractions(int n) {vector<string> ans;for (int denominator = 2; denominator <= n; ++denominator) {for (int numerator = 1; numerator < denominator; ++numerator) {if (__gcd(numerator, denominator) == 1) {ans.emplace_back(to_string(numerator) + "/" + to_string(denominator));}}}return ans;}
};
- 数位成本和为目标值的最大数字
给你一个整数数组 cost 和一个整数 target 。请你返回满足如下规则可以得到的 最大 整数:
给当前结果添加一个数位(i + 1)的成本为 cost[i] (cost 数组下标从 0 开始)。
总成本必须恰好等于 target 。
添加的数位中没有数字 0 。
由于答案可能会很大,请你以字符串形式返回。
如果按照上述要求无法得到任何整数,请你返回 “0” 。
实际是一个背包问题,恰好塞满背包,令idx最大
class Solution {
public:string largestNumber(vector<int> &cost, int target) {vector<int> dp(target + 1, INT_MIN);dp[0] = 0;for (int c : cost) {for (int j = c; j <= target; ++j) {dp[j] = max(dp[j], dp[j - c] + 1);}}if (dp[target] < 0) {return "0";}string ans;for (int i = 8, j = target; i >= 0; i--) {for (int c = cost[i]; j >= c && dp[j] == dp[j - c] + 1; j -= c) {ans += '1' + i;}}return ans;}
};
- 在既定时间做作业的学生人数
给你两个整数数组 startTime(开始时间)和 endTime(结束时间),并指定一个整数 queryTime 作为查询时间。已知,第 i 名学生在 startTime[i] 时开始写作业并于 endTime[i] 时完成作业。请返回在查询时间 queryTime 时正在做作业的学生人数。形式上,返回能够使 queryTime 处于区间 [startTime[i], endTime[i]](含)的学生人数。
有手就行
class Solution {
public:int busyStudent(vector<int>& startTime, vector<int>& endTime, int queryTime) {int ret = 0;for (int i = 0; i < startTime.size(); ++i) {if (startTime[i] <= queryTime && queryTime <= endTime[i]) {ret++;}}return ret;}
};
- 重新排列句子中的单词
「句子」是一个用空格分隔单词的字符串。给你一个满足下述格式的句子 text :句子的首字母大写
text 中的每个单词都用单个空格分隔。请你重新排列 text 中的单词,使所有单词按其长度的升序排列。如果两个单词的长度相同,则保留其在原句子中的相对顺序。请同样按上述格式返回新的句子。
找出每个单词,然后排序
class Solution {
private:vector<string> split(const string& str){vector<string> res;stringstream ss(str);string curr;while (ss >> curr) {res.push_back(curr);}return res;}public:string arrangeWords(string text) {text[0] = tolower(text[0]);vector<string> strs = split(text);stable_sort(strs.begin(), strs.end(), [](const string& a, const string& b){return a.size() < b.size();});stringstream ss;strs[0][0] = toupper(strs[0][0]);ss << strs[0];for (int i = 1; i < strs.size(); ++i){ss << " " << strs[i];}return ss.str();}
};