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

反转单词顺序

题目描述

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

思路

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

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    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;  

代码

1
2
3
4
5
6
7
8
9
10
11
//首先是我自己的思路
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;
}
1
2
3
4
5
6
7
8
9
10
11
//直接变成一个二倍的字符串,进行截取;
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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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用了,真的是可怕。。。;结果人家是找寻字符串内是否有目标字符串的;