题目
本人比较菜,八道题只a了五道比较简单的,在这里简单整理一下思路。
题目就只附上链接,不完全复制过来了。
题目分别是:
5384.拥有最多糖果的孩子
5385.改变一个整数能得到的最大差值
5386.检查一个字符串是否可以打破另一个字符串
5400.旅行终点站
5401.是否所有1都至少相隔k个元素
|
|
---|
题目分析
5384.拥有最多糖果的孩子
这题目描述起来看着挺难的,实际很简单。遍历一遍数组找到数组最大值。然后再次遍历数组,计算每个元素与最大值的差值,如果这个差值大于额外的糖果数量,那么返回false
,反之,则返回true
。
比较简单,完整解答见最后。
5385.改变一个整数能得到的最大差值
这道题思路也比较简单,就是实现起来略微复杂。
首先要将这个数组的每一位数字都取出来,比较直观的想法是对这个数字除10取余可以得到个位数字,然后再对这个除10取商,循环上述过程,直到当前数组小于等于0。
由于这样的过程是从个位数开始存取,为了方便后续操作,我使用了栈来保存每一位数字。
stack s;
while (num > 0){
s.push(num % 10);
num /= 10;
}
然后需要将改变这个数字,需要分别改造成最大值和最小值。
改造最大值的方法:从栈的顶部开始遍历,如果第一个元素不等于9,那么将其记录并改为9;如果第一个元素等于9,那么弹出,直到遇到不为9的第一个数字,记录其并改为9。之后不断弹出顶端元素,将与记录值相等的元素都改为9。
改造最大值的过程如下:
int max_num = 0;
int flag = 0;
int len = s.size();
for (int i = 0; i < len; i++){
if (flag == 0){
if (s.top() != 9){
int temp = s.top();
flag = 1;
}
}else {
if (s.top() == temp) s.top() = 9;
}
max_num += pow(10, s.size() - 1) * s.top();
s.pop();
}
改造最小值的方法比最大值复杂一点,由于不能将首位改为0,所以如果首位不为1的情况,应该将首位的数字全部改成1;如果首位不为1,应该将接下来的第一个非0元素改为0。
改造最小值的过程如下:
int min_num = 0;
while (s.top() == 1 || s.top() == 0){
min_num += pow(10, s.size() - 1) * s.top();
s.pop();
flag = 0;
}
int len = s.size();
int temp = s2.top();
for (int i = 0; i < s.size(); i++){
if (flag == 0){
if (s.top() == temp) s.top() = 0;
}else {
if (s.top() == temp) s.top() = 1;
}
min_num += pow(10, s.size() - 1) * s.top();
s.pop();
}
最后返回最大值与最小值的差值即可。
5386.检查一个字符串是否可以打破另一个字符串
这道题我最初想复杂了,我最初没有思路,只好暴力求解:利用回溯算法求出s1
和s2
的全排列,然后将依次将两个字符串的全排列对比是否可以打破,只要找到一个可以打破的,就返回true
。
上述思路可以计算出结果,但是最后几组数据会超时。最后几分钟时,我突然想到,可以给s1
和s2
分别按字典序排序,然后直接计算排序后的s1
和s2
能否打破或被打破即可。
在这里简单梳理一下分辨两个字符串能否打破或被打破的过程:用两个计数器分别记录s1[i] > s2[i]
和s1[i] < s2[i]
的个数,如果s1[i] == s2[i]
,两个计数器都自增1。
bool isBreak(string s1, string s2){
if (s1.length() == 0) return false;
int in = 0;
int out = 0;
int len = s1.length();
for (int i = 0; i < len; i++){
if (s1[i] == s2[i]){
in++;
out++;
}
else if (s1[i] > s2[i]) in++;
else out++;
}
return out == len || in == len;
}
题目完整的解答见最后。
5400.旅行终点站
这道题目也是看起来复杂实际简单的。
我是暴力解开的,遍历每个路线,取终点,然后检验这个终点是否是别的路线的,若不是任何其他路线的起点,则返回这个终点即可。
int count = 0;
int len = paths.size();
for (auto t1 : paths){
for (auto t2 : paths){
if (t1[1] == t2[0]) count++;
else break;
}
if (len == count) return t1[1];
else continue;
}
完整解答见最后。
5401.是否所有1都至少相隔k个元素
这道题也比较简单。使用一个数组记录给定数组中值为1的索引,然后遍历这个索引数组,如果相邻元素差值小于k,则返回false。
for (int i = 0; i < nums.size(); i++){
if (nums[i] == 1) temp.push_back(i);
}
if (temp.size() == 0) return true;
for (int i = 0; i < temp.size() - 1; i++){
if (temp[i + 1] - temp[i] - 1 < k) return false;
}
return true;
完整的解答见最后。
题目解答
5384.拥有最多糖果的孩子
class Solution {
public:
vector res;
vector kidsWithCandies(vector& candies, int extraCandies) {
if (candies.size() == 0) return res;
int max = candies[0];
for (auto temp : candies){
if (temp > max) max = temp;
}
// 思路 找到最大值,再遍历一遍数组,如果差值小于等于extracandies,则返回true;
for (auto temp : candies){
if (max - temp <= extraCandies) res.push_back(true);
else res.push_back(false);
}
return res;
}
};
5385.改变一个整数能得到的最大差值
class Solution {
public:
stack s1, s2;
int maxDiff(int num) {
if (num < 10) return 8;
while (num > 0){
s1.push(num % 10);
num /= 10;
}
s2 = s1;
int len = s1.size();
int num1 = 0;
int num2 = 0;
int flag = 0;
int temp;
for (int i = 0; i < len; i++){
if (flag == 0){
if (s1.top() != 9) {
temp = s1.top();
s1.top() = 9;
flag = 1;
}
}else {
if (s1.top() == temp){
s1.top() = 9;
}
}
num1 += s1.top() * pow(10, s1.size() - 1);
s1.pop();
}
while (s2.top() == 1 || s2.top() == 0){
num2 += pow(10, s2.size() - 1) * s2.top();
s2.pop();
flag = 0;
}
len = s2.size();
temp = s2.top();
for (int i = 0; i < len; i++){
if (flag == 0){
if (s2.top() == temp){
s2.top() = 0;
}
}else {
if (s2.top() == temp){
s2.top() = 1;
}
}
num2 += pow(10, s2.size() - 1) * s2.top();
s2.pop();
}
return num1 - num2;
}
};
5386.检查一个字符串是否可以打破另一个字符串
bool isBreak(string s1, string s2){
if (s1.length() == 0) return false;
int in = 0;
int out = 0;
int len = s1.length();
for (int i = 0; i < len; i++){
if (s1[i] == s2[i]){
in++;
out++;
}
else if (s1[i] > s2[i]) in++;
else out++;
}
return out == len || in == len;
}
bool checkIfCanBreak(string s1, string s2) {
sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end());
return isBreak(s1, s2);
}
5400.旅行终点站
class Solution {
public:
string res;
string destCity(vector>& paths) {
if (paths.size() == 1) return paths[0][1];
int count = 0;
int len = paths.size();
for (auto t1 : paths){
for (auto t2 : paths){
if (t1[1] == t2[0]) break;
else count++;
}
if (count == len){
res = t1[1];
break;
}else {
count = 0;
}
}
return res;
}
};
5401.是否所有1都至少相隔k个元素
class Solution {
public:
vector temp;
bool kLengthApart(vector& nums, int k) {
if (nums.size() == 1) return true;
for (int i = 0; i < nums.size(); i++){
if (nums[i] == 1) temp.push_back(i);
}
if (temp.size() == 0) return true;
for (int i = 0; i < temp.size() - 1; i++){
if (temp[i + 1] - temp[i] - 1 < k) return false;
}
return true;
}
};