算法训练营2021
链接: https://pan.baidu.com/s/1d6YONkCi4u7T1ZBm1yZLYg 提取码: iamh
作者-\/ 307570512
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶: 请选用C语言的用户尝试使用 O(1) 空间复杂度的原地解法。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
if(nums1.empty() || nums2.empty())
return vector<int>();
unordered_set<int> st;
for(auto a : nums1)
st.insert(a);
vector<int> res;
for(int a : nums2)
{
if(st.count(a) > 0)
{
res.push_back(a);
st.erase(a);
}
}
return res;
}
};
Python代码
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
s = set()
res = []
for a in nums1:
s.add(a)
for a in nums2:
if a in s:
res.append(a)
s.remove(a)
return res
单词间的空格要减到一个,因此需要另一块内存来存放消除掉空格的字符串
s首尾都有可能有空格,所以刚开始需要过滤掉收尾的空格
s可能全都是空格,这种情况输出空字符串
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public:
void reverseWords(string &s) {
if(s.empty()) return;
while(!s.empty() && s.back() == ' ')
s.pop_back();
if(s.empty()) return;
reverse(s.begin(),s.end());
while(!s.empty() && s.back() == ' ')
s.pop_back();
string s1(s);
s.clear();
int len = s1.size();
int l = 0,r = 0;
while(r < len)
{
if(s1[r] == ' ')
{
reverse(s1.begin() + l,s1.begin() + r);
copy(s1.begin() + l,s1.begin() + r + 1,back_inserter(s));
while(s1[r] == ' ' && r < len) r++;
l = r;
}
r++;
}
reverse(s1.begin() + l,s1.begin() + r);
copy(s1.begin() + l,s1.begin() + r,back_inserter(s));
}
};