推荐

完整《剑指Offer》算法题解析系列请点击 👉 《剑指Offer》全解析 Java 版

题目描述

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

public class Solution {
   
    public String LeftRotateString(String str,int n) {
   
        
    }
}

参考思路:

用两个原字符串拼成一个新字符串,然后以纯左移量位置开始截取原字符长度的字符。即可获得左移后的字符串。

纯左移量:比如字符串长度为5,左移 3,左移 8,左移 13 …左移结果其实量都是3,因为每左移的 数组长度(比如5) 位时,与原字符串就一样了。

示例:

字符串 “abc",要左移 7 位。

  1. 用两个原字符串 “abc” 拼成一个新字符串 “abcabc”。
  2. 用左移量与字符串长度取模,获取纯左移量,也就是截取开始的位置。
    7 % 3 = 1 ,纯左移量为 1 。
  3. 用纯左移量加上字符长度,获取截取结束的位置。
    1 + 3 = 4;
  4. 从新字符串 ”abcabc“ 的 下标1号位截取到下标4号位(下标从0开始)。
    截取结果为:“bca”
  5. 返回截取结果 “bca” ,也就是左移结果。

参考实现:

public class Solution {
   
    public String LeftRotateString(String str,int n) {
   
        int len = str.length();
        if (len == 0){
   
            return "";
        }
        //将两个字符串拼成一个,然后从中截取获得左移后的字符串
        String st = str + str;
        //因为n可能大于数组长度,所以取余,获取左移的位数,即截取的初始位置
        n = n % len;
        //获取要截取到的位置
        len = len + n;

        //截取并返回结果。
        return st.substring(n,len);
    }
}

看完之后,如果还有什么不懂的,可以在评论区留言,会及时回答更新。

这里是猿兄,为你分享程序员的世界。

非常感谢各位大佬们能看到这里,如果觉得文章还不错的话, 求点赞👍 求关注💗 求分享👬求评论📝 这些对猿兄来说真的 非常有用!!!

注: 如果猿兄这篇博客有任何错误和建议,欢迎大家留言,不胜感激!