面试题58 - I 翻转单词顺序
题目描述: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
- 解题思路:
class Solution {
public:
string ReverseSentence(string str) {
auto size = str.size();
if(size == 0) return "";
int mark=0;
str += ' ';
for(int i = 0; i < size+1; ++i){
if(str[i] == ' '){
ReverseWord(str, mark, i-1);
mark = i+1;
}
}
str = str.substr(0, size);
ReverseWord(str, 0, size-1);
return str;
}
void ReverseWord (string &str, int l, int r){
while(l < r){
swap(str[l], str[r]);
++l;
--r;
}
}
};
面试题58 - II 左旋转字符串
题目描述: 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
- 解题思路:
class Solution {
public:
string LeftRotateString(string str, int n) {
int len = str.length();
if(len == 0) return "";
n = n % len;
str += str;
return str.substr(n, len);
}
};
面试题59 - I 滑动窗口的最大值(*)
题目描述: 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
示例:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
- 解题思路:
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
vector<int>max;
if(num.empty()||size>num.size()||size<1)
return max;
int m;
for(int i=0;i<num.size()-size+1;i++)
{
m=num[i];
for(int j=i+1;j<i+size;j++)
{
if(num[j]>m)
{
m=num[j];
}
}
max.push_back(m);
}
return max;
}
};
面试题59 - II 队列的最大值(**)
题目描述: 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
示例 1:
输入:
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]
示例 2:
输入:
["MaxQueue","pop_front","max_value"]
[[],[],[]]
输出: [null,-1,-1]
- 解题思路:
template<typename T> class QueueWithMax {
private:
struct InternalData {
T number;
int index;
};
deque<InternalData> data;
deque<InternalData> maximums;
int currentIndex;
public:
QueueWithMax(): currentIndex(0) {}
void push_back(T number) {
while(!maximums.empty() && number>=maximums.back().number)
maximums.pop_back();
InternalData internalData = {number, currentIndex};
data.push_back(internalData);
maximums.push_back(internalData);
++currentIndex;
}
void pop_front() {
if(maximums.empty()) throw new expection("queue is empty");
if(maximums.front().index == data.front().index) maximums.pop_front();
data.pop_front();
}
T max() const {
if(maximums.empty()) throw new expection("queue is empty");
return maximums.front().number;
}
};