剑指offer—左旋转字符串 解答

剑指offer—左旋转字符串

题目描述

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

思路

重点:

  • String.substring()

将前n个需要旋转的字符串添加到字符串后面,返回n到字符串结尾的子字符串

代码

public class Solution {
    public String LeftRotateString(String str,int n) {
        if(str.length()<=0) return str;
        str += str.substring(0,n);
        return str.substring(n);
    }
}

扩展—LeetCode796旋转字符串

题目描述

给定两个字符串, A 和 B。

A 的旋转操作就是将 A 最左边的字符移动到最右边。 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' 。如果在若干次旋转操作之后,A 能变成B,那么返回True。

示例 1:
输入: A = 'abcde', B = 'cdeab'
输出: true

示例 2:
输入: A = 'abcde', B = 'abced'
输出: false

思路

循环n次,n为A的长度,每一次左旋一个字符,进行判断,如果相等,返回true

A和B可能同时为空,所以不会进入循环,最后还需要进行判断,不相等时才返回false

代码

class Solution {
    public boolean rotateString(String A, String B) {
        for(int i=0;i<A.length();i++){
            if(A.equals(B)) return true;
            A += A.substring(0,1);
            A = A.substring(1);
        }
        return A.equals(B)?true:false;
    }
}

扩展—剑指offer—翻转单词序列

题目描述

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

思路

  • 熟练使用substring

从右到左遍历字符串,每碰到一个空格,用变量i保存前一个空格的索引,执行一次子字符串的插入,substring(当前位置,i),但是在我们不把i的空格插入,而是每次插入一个空格,因为最前面左边和最后面右边没有空格,字符串连接时会使字符串前后单词间没有空格,循环到最左边时,由于当前序列可能是一个单词或者一个句子,所以我们不能落下i处元素,我们插入索引为i的元素,最后返回时只需返回整个字符串的长度的子字符串。

代码

public class Solution {
    public String ReverseSentence(String str) {
        if(str.length()<=0) return "";
        int l = str.length()-1;
        int i = l;
        String s = "";
        for(int m=l;m>=0;m--){
            if(str.charAt(m)==' '){
                s += str.substring(m+1,i==l?i+1:i)+" ";
                i = m;
            }else if(m==0) s += str.substring(0,i+1);
        }
        return s.substring(0,l+1);
    }
}