【剑指 Offer 58 - I. 翻转单词顺序 简单】【151. 翻转字符串里的单词 中等】【剑指 Offer 58 - II. 左旋转字符串 简单】
【剑指 Offer 58 - I. 翻转单词顺序 简单】【151. 翻转字符串里的单词 中等】
1. 题目描述
给定一个字符串,逐个翻转字符串中的每个单词。
说明:
无空格字符构成一个 单词 。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
示例 1:
输入:"the sky is blue"
输出:"blue is sky the"
示例 2:
输入:" hello world! "
输出:"world! hello"
解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入:"a good example"
输出:"example good a"
解释:如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
示例 4:
输入:s = " Bob Loves Alice "
输出:"Alice Loves Bob"
示例 5:
输入:s = "Alice does not even like bob"
输出:"bob like even not does Alice"
提示:
1 <= s.length <= 104
s 包含英文大小写字母、数字和空格 ' '
s 中 至少存在一个 单词
2. 思路
先把字符串整体反转,再依次翻转每一个单词
class Solution { public: void reverseStr(string& str, int start, int end) { while(start < end) { char tmp = str[start]; str[start] = str[end]; str[end] = tmp; ++start; --end; } } string reverseWords(string s) { int len = s.length(); if(len == 0) return ""; string res = ""; reverseStr(s, 0, len - 1); cout<<s<<endl; int start = 0, end = 0; while(start < len) { if(s[start] == ' ') { ++start; ++end; } else if(s[end] == ' ' || end == len - 1) { if(s[end] == ' ') --end; reverseStr(s, start, end); for(int i = start; i <= end; i++) res += s[i]; res += ' '; ++end; start = end; } else { ++end; } } res.pop_back(); return res; } };
【剑指 Offer 58 - II. 左旋转字符串 简单】
1. 题目描述
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
2. 思路
和上面两题一样,先部分反转,再全部反转
3. 代码
class Solution { public: void reverseStr(string& str, int start, int end) { while(start < end) { char tmp = str[start]; str[start] = str[end]; str[end] = tmp; ++start; --end; } } string reverseLeftWords(string s, int n) { int len = s.length(); reverseStr(s, 0, n-1); reverseStr(s, n, len -1); reverseStr(s, 0, len - 1); return s; } };