剑指Offer 42反转单词顺序 vs左旋转字符串

来源:互联网 发布:unity3d开发人员 编辑:程序博客网 时间:2024/06/04 23:12

反转单词顺序

题目描述

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

思路

  1. 主要依靠的就是两次旋转,先对整体,这样整体都换了位置,那么此时单个单词的位置应该就没有问题了;然后将单个单词再进行反转即可;

代码

String  Reverse (String str, int begin,int end)    {        if (str==null||begin>end||begin<0||end<0)            return null;        char [] a = str.toCharArray();        char temp;        while (begin<end)   //简单的反转单个字符        {            temp = a[begin];            a[begin] = a[end];            a[end] = temp;            begin++;            end--;        }        str = String.valueOf(a);        return str;    }    /*    反转单词    */    static public String ReverseSentence(String str) {        if (str==null||str.length()==0)            return "";        int begin = 0;        int end = str.length()-1;        String strbackups = str;        str = Reverse(str,begin,end);        end =begin;        while (begin<str.length()-1)        {            if (str.charAt(begin)==' ')   //遇见空格,跳过            {                begin++;                end++;            }            else  if ((end ==str.length())||str.charAt(end) ==' ' )            {                str = Reverse(str,begin,--end);                begin = ++end;            }            else                            //平常end指针就狂加;            {                end++;            }        }        return  str;    }

左旋转字符串

题目描述

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

思路

  1. 很简单,分成两段,前面的放在后面,齐活
  2. 依靠前面的思路,依靠旋转 A+B–>B+A???要怎么做呢
    (At+Bt)t ==Btt+Att=A+B;  

代码

//首先是我自己的思路 static   public String LeftRotateString(String str,int n) {        if (str==null)            return  null;        if (n==0||str.length()==0)            return  str;        n=n>str.length()?n%str.length():n;        String a = str.substring(0,n);        String b = str.substring(n,str.length());        return  b+a;    }
//直接变成一个二倍的字符串,进行截取;static   public String LeftRotateString1(String str , int n) {        if (str==null)            return  null;        if ( n==0||str.length()==0)            return str;        n=n%str.length();        str+=str;       str = str.substring(n,str.length()/2+n);        return  str;    }
  static   public String LeftRotateString2(String str , int n){        if (str==null||str.length()==0)            return null;        n=n%str.length();        if (n<=0)            return str;        String strback = str;        int begin = 0;        int end = str.length()-1;        str = Reverse(str,begin,n-1);        str = Reverse(str,n,end);        str = Reverse(str,begin,end);        return str;    }    static String  Reverse (String str, int begin,int end)    {        if (str==null||begin>end||begin<0||end<0)            return null;        char [] a = str.toCharArray();        char temp;        while (begin<end)   //简单的反转单个字符        {            temp = a[begin];            a[begin] = a[end];            a[end] = temp;            begin++;            end--;        }        str = String.valueOf(a);        return str;    }

收获

  1. 首先是关于代码,自己想最好,看被人代码,有时候考虑不全面;
  2. String有个indexOf,我当成CharAt用了,真的是可怕。。。;结果人家是找寻字符串内是否有目标字符串的;
0 0
原创粉丝点击