【LeetCode两题选手】算法类题目(7.29)

题一:翻转字符串里的单词

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:

输入: "the sky is blue"
输出: "blue is sky the"
示例 2:

输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:

输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

有两个思路。

思路一:外部vector暂存

思路二:旋转vector法(原地)

心照不宣。

我一开始并没有想起来第二种方法,也是看了题解才想起来还有这么一招。

代码

代码一:

string reverseWords(string s){
    vector<string> vs; 
    string temp="";
    int i=0;
    while(s[i]!='\0'){               //遍历直到结尾 
        if (s[i]==' '){              //遇到空格
            if (!temp.empty())
                vs.push_back(temp); //单词放入容器中
            ++i;                    // 跳过空格 
            temp="";        }
        else{
            temp.push_back(s[i]);   //将字母加到temp字符串后面
            ++i;
        }
    }
    if (!temp.empty())
        vs.push_back(temp);       //将最后一个单词放入容器中

    int len=vs.size();            //倒序遍历容器
    string res="";
    for(int j=0;j<len;++j){
        res.append(vs[len-j-1]);
        if(j!=len-1)
            res.push_back(' ');
    }
    return res;
}

代码二:

先将整个字符串翻转,再对每个单词进行翻转。

class Solution {
public:
    string reverseWords(string s) {
        int len = s.size(), blank_num = 0, prune = (int) (s[0]==' ');
        char *tail = &s[len], *start = &s[0], *end = &s[0]-1;
        reverse(start, tail);
        while (true){
            while (++end<tail && *end == ' ')blank_num ++;
            while (++end<tail && *end != ' '){}
            reverse(start, end);
            if (end>=tail)return s.substr(0, len-blank_num-prune);
            start = end - blank_num + 1;
        }
    }
};

题二:简化路径

以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径

请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。

示例 1:

输入:"/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。
示例 2:

输入:"/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。
示例 3:

输入:"/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4:

输入:"/a/./b/../../c/"
输出:"/c"
示例 5:

输入:"/a/../../b/../c//.//"
输出:"/c"
示例 6:

输入:"/a//b////c/d//././/.."
输出:"/a/b/c"

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/simplify-path
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

维护一个 vector 用以维护 实际路径

代码实现

	string simplifyPath(string path) {
        vector<string> str;
        stringstream ss(path);
        string sub;
        while(getline(ss,sub,'/'))
        {
            if(sub=="."||sub=="")
                continue;
            if(sub==".."&&str.size())
                str.pop_back();
            if(sub!="..")
                str.push_back(sub);
        }
        string res;
        for(string s:str)
            res+="/"+s;
        if(res.empty())
            res+="/";
        return res;
    }

猜你喜欢

转载自blog.csdn.net/qq_43762191/article/details/107656888