剑指offer - 58.1翻转单词顺序 | 58.2左旋转字符串 | 59.1滑动窗口的最大值 | 59.2 队列的最大值

面试题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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值