一、题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
二、分析
1.先写一个反转函数,功能是可以反转所有传入的字符串 2.整体反转整个字符串,此时就需要将每个单词的字母顺序翻转,所以遍历此时的字符串 3.遇到空格就记录一个单词的起始位置或截止位置,然后将单词传入反转函数,时期
引用传参、swap函数:
class Solution {
public:
void reverseworld(string &str,int i,int j)
{//i和j分别是翻转部分字符串的起止位置
while(i < j)
{
swap(str[i++],str[j--]);
}
}
string ReverseSentence(string str) {
int len = str.size();
reverseworld(str,0,len-1);
int i = 0;//i是单词开始位置
int j = 0;//j是单词终止为止
int k = 0;//用来做遍历字符串的变量
while(k < len)
{
while(k<len && str[k] == ' ' )//记录空格的位置
{
k++;
}
i = k;//记录开始位置,str[i]是空格
while( k<len && str[k] != ' ')
{
k++;
}
j = k;//str[j]此时是空格,所以再反转的时候,应该截止到它前一个翻转
reverseworld(str,i,j-1);
}
return str;
}
};
指针传参、利用指针的交换函数:
左旋转字符串题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
分析:
方法一:
class Solution {
public:
string LeftRotateString(string str, int n) {
string s;
int j = 0;
for(int i=n ;i<str.length();i++)
{
s[j]=str[i];
j++;
}
for(int i = 0; i<=n-1; i++)
{
s[j] = str[i];
j++;
}
return s;
}
};
|