【剑指offer】面试题42-翻转单词顺序VS左旋转字符串

题目一:

问题描述:

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字符一样处理。比如输入字符串”I am a student.”输出字符串”student. a am I”.


问题分析:

这种题目比较简单,翻转两次字符串就可以。第一次翻转整体字符串,第二次翻转单个单词。当然两次顺序可以颠倒~~实现起来比较简单,主要就是翻转函数。


代码实现:

#include<iostream>
using namespace std;
#include<cassert>
void ReverseWord(char* begin, char* end)
{
       assert(begin && end);
       while (begin < end)
       {
              char tmp = *begin;
              *begin = *end;
              *end = tmp;
              begin++; 
              end--;
       }
}
void ReverseSentence(char* str,int len)
{
     assert(str);
     char* start = str;
     char* end = str;
     ReverseWord(start, str + len - 1);
     //
     while (*end != '\0')
     {
            while (*end != ' ' && *end != '\0')
            {
                   ++end;
            }//遇到了空格或者字符串结束了
           ReverseWord(start, end - 1);
           if (*end != '\0')
            {
                   start = end + 1;
                   end = start;
            }
    }
}

int main()
{
       char str[] = "I am a student";
       ReverseSentence(str,sizeof(str)/sizeof(str[0])-1);
       cout << str << endl;
       system("pause");
       return 0;
}

题目二:

问题描述:

字符串的左旋转操作是把字符串的前边若干个字符移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串“abcdefg”和数字2,则输出“cdefgab”.


问题分析:

有了上边一个题目的基础,这个题目仍然是旋转,旋转整体和旋转部分。就像上个题目一样,旋转整个字符串再旋转每个单词,这个题目也是旋转整个字符串,再旋转需要左移的前n个字符和剩下的后n个字符,仍然可以调用上边的ReverseWord()函数。


代码实现:

#include<iostream>
using namespace std;
#include<cassert>
//左旋
void ReverseWord(char* begin, char* end)
{
       assert(begin && end);
       while (begin < end)
       {
              char tmp = *begin;
              *begin = *end;
              *end = tmp;
              begin++;
              end--;
       }
}
void LeftRotate(char* str, int n)
{
       assert(str);
       int len = strlen(str);
       if (n < len && n > 0 && len > 0)
       {
              //先翻转前n
              ReverseWord(str, str + n - 1);
              //翻转后边的字符
              ReverseWord(str + n, str + len - 1);
              //翻转整体
              ReverseWord(str, str + len - 1);
       }

}
int main()
{
       char str[] = "abcdef";
       LeftRotate(str,2);
       cout << str << endl;
       system("pause");
       return 0;
}

今天的题目就分析到这里了~最后还是想祝大家新年快乐~希望自己在新的一年里放下不属于自己的人或事~成为更好的自己~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值