• 58 翻转字符串


    题目一:翻转单词顺序列

    牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

    测试序列:

    1)功能测试(句子中有多个单词、只有一个单词)

    2)特殊输入测试(空字符串、字符串中只有空格、)

    解题思路:

    通过两次翻转字符串(不占用额外的空间)

    1)反转句子中所有字符 如"hello world!"  反转后是"!dlrow olleh"

    2)再反转每个单词中的字符的顺序 翻转后"world! hello"

    class Solution {
    public:
        string ReverseSentence(string str) {
            //string res;
            int size = str.size();
            if(size==0)
                return str;
            
            int pFront = 0;
            int pBack = size-1;
    
            ReverseStr(pFront, pBack, str);
            
            //反转每个单词
            pBack = 0;
            while(pFront < size){
                if(str[pFront] ==' '){
                    pBack = ++pFront; //移到下一个单词的首字母
                }else if(str[pBack] ==' ' || pBack ==size){
                    //找到单词结尾后的空格(或字符串结尾)
                    ReverseStr(pFront, --pBack, str);
                    //更新pFront与pBack
                    pFront = ++pBack;
                }else{
                    pBack++;  //寻找单词结尾
                }
            }
            
            return str;
            
            
        }
        
        void ReverseStr(int pf, int pb,string &str){
            //if(pf==nullptr ||pb==nullptr) //交换的两个指针必须有字符(非空格)
                //return;
            while(pf<pb){
                char temp = str[pf];
                str[pf] = str[pb];
                str[pb] = temp;
                pf++;
                pb--;
            }
            return;
        }
    };
    

      

    代码编写不当:不要对string使用string指针!!!直接用下标即可!!!

    string *p = &a;

    p++;  //不知道是什么,总之不是下一个字符!!!

     1 class Solution {
     2 public:
     3     string ReverseSentence(string str) {
     4         //string res;
     5         int size = str.size();
     6         if(size==0)
     7             return str;
     8         
     9         string *pFront = &str;
    10         string *pBack = &str;
    11         while(*pBack != ""){
    12             pBack++;
    13         }
    14         pBack--;
    15         //翻转整个字符串
    16         ReverseStr(pFront, pBack);
    17         
    18         //反转每个单词
    19         while(*pFront != ""){
    20             if(*pFront ==" "){
    21                 pBack = ++pFront; //移到下一个单词的首字母
    22             }else if(*pBack ==" " || *pBack ==""){
    23                 //找到单词结尾后的空格(或字符串结尾)
    24                 ReverseStr(pFront, --pBack);
    25                 //更新pFront与pBack
    26                 pFront = ++pBack;
    27             }else{
    28                 pBack++;  //寻找单词结尾
    29             }
    30         }
    31         
    32         return str;
    33         
    34         
    35     }
    36     
    37     void ReverseStr(string *pf, string *pb){
    38         if(pf==nullptr ||pb==nullptr) //交换的两个指针必须有字符(非空格)
    39             return;
    40         while(pf<pb){
    41             //swap
    42             //*pf = *pf + *pb;  //此处是字符串,不能相减
    43             //*pb = *pf - *pb;
    44             //*pf = *pf - *pb;
    45             //swap(*pf,*pb);
    46             string temp = *pf;
    47             *pf = *pb;
    48             *pb = temp;
    49             pf++;
    50             pb--;
    51         }
    52         return;
    53     }
    54 };
    error

    题目二:左旋转字符串

    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

    测试序列:

    1)功能测试(把长度为n的字符串左旋转0个、1个、2个、n-1个、n个、n+1个字符)

    2)特殊输入测试(字符串为空串----如果是char*输入,也要考虑字符串指针为空指针,和指针指向空字符串)

    解题思路:

    参照题目一的思路:

    对字符串"abcdefgh"左翻转3位,结果是"defghabc"

    1)将字符串分成两个部分,分别是要左移的三位,与剩下的几位。即"abc" "defgh"

    对两部分分别翻转:"cbahgfed"

    2)然后对得到的字符串翻转

    "defghabc"

    class Solution {
    public:
        string LeftRotateString(string str, int n) {
            int sz = str.size();
            if(n<=0 || sz<=1) 
                return str;
                
            n = n%sz;  //处理n大于sz时
            ReverseStr(0, n-1, str);
            ReverseStr(n, sz-1, str);
            ReverseStr(0, sz-1, str);
            
            return str;
        }
        
        void ReverseStr(int pf, int pb, string& str){
            while(pf<pb){
                char temp = str[pf];
                str[pf] =  str[pb];
                str[pb] =  temp;
                pf++;
                pb--;
            }
            return;
        }
    };
    

      

  • 相关阅读:
    视频基础知识 720P、1080i、1080P
    PS/ES/TS区别
    服务端时间与COOKIE问题
    H.264名词
    一组视频音频编辑软件的介绍
    浅述WinForm多线程编程与Control.Invoke的应用
    [原创]补丁工具V1.6.3
    .net序列化与反序列化错误,可能是Local Settings\Temp不存在引起
    通过IViewObject接口,取浏览器的图象,实现SNAP
    C#实现一个用于开机启动其他程序的Windows服务
  • 原文地址:https://www.cnblogs.com/GuoXinxin/p/10841623.html
Copyright © 2020-2023  润新知