题目来源于知识星球—英雄算法联盟,六月算法集训专题
目录
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、2000.反转单词前缀(简单)
1.题目描述
2.解题思路
首先使用find函数来获得ch在word数组中的下标,当此下标为-1时,表示ch在
数组word中不存在,则返回原数组。如果此下标大于0,将下标从0到ch的下
标的元素进行反转,使用reverse函数实现。
3.代码演示(C++)
class Solution
{
public:
string reversePrefix(string word, char ch)
{
int index=word.find(ch);
if(index==-1)
{
return word;
}
else
{
reverse(word.begin(),word.begin()+index+1);
return word;
}
}
};
4.题目链接
二、917.仅仅反转字母(简单)
1.题目描述
2.解题思路
运用双指针一前一后进行遍历,指针i判断左侧是否扫描到字母,指针j
判断右侧是否扫描到字母,最后将两个位置的字母进行交换,i++,j--。
3.代码演示(C++)
class Solution
{
public:
string reverseOnlyLetters(string s)
{
int n=s.size();
int i=0;
int j=n-1;//用双指针一前一后开始遍历
while(true)
{
while(i<j&&!isalpha(s[i]))//判断左侧是否扫描到字母
{
i++;
}
while(i<j&&!isalpha(s[j]))//判断右侧是否扫描到字母
{
j--;
}
if(i>=j)
{
break;
}
swap(s[i],s[j]);//将两个位置的字母交换
i++;
j--;
}
return s;
}
};
4.题目链接
三、475.供暖器(中等)
1.题目描述
2.解题思路
代码来源于官方题解!
3.代码演示(C++)
class Solution
{//官方题解
public:
int findRadius(vector<int> &houses, vector<int> &heaters)
{
int ans = 0;
sort(heaters.begin(), heaters.end());
for (int house: houses)
{
int j = upper_bound(heaters.begin(), heaters.end(), house) - heaters.begin();
int i = j - 1;
int rightDistance = j >= heaters.size() ? INT_MAX : heaters[j] - house;
int leftDistance = i < 0 ? INT_MAX : house - heaters[i];
int curDistance = min(leftDistance, rightDistance);
ans = max(ans, curDistance);
}
return ans;
}
};
4.题目链接
四、面试题16.06.最小差(中等)
1.题目描述
2.解题思路
分别将两个数组进行升序排列,然后遍历,求出最小的差的绝对值并返回。
3.代码演示(C++)
class Solution
{
public:
int smallestDifference(vector<int>& a, vector<int>& b)
{
sort(a.begin(), a.end());
sort(b.begin(), b.end());
int na = a.size();
int i = 0;
int nb = b.size();
int j = 0;
long res = LONG_MAX;
while (i < na && j < nb)
{
if (a[i] != b[j])
{
res = min(res, abs((long)a[i]-(long)b[j]));
a[i] > b[j] ? ++j : ++i;
}
else
{
// 相等直接返回最小绝对值 0
return 0;
}
}
return res;
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!