美文网首页
剑指 offer 笔记 43 | 左旋转字符串

剑指 offer 笔记 43 | 左旋转字符串

作者: ProudLin | 来源:发表于2019-11-11 21:57 被阅读0次

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

思路分析
这道题考查的核心是灵活利用字符串翻转。

1.先翻转前半部分

2.再翻转后半部分

3.再对字符串整个进行翻转

比如“ab”对应“ba”,“xyz”对应“zyx”,总共需要三步即可得到期望想过

反转要移位的部分,”abcXYZdef”操作后是”cbaXYZdef”
反转其余的部分,”cbaXYZdef”操作后是”cbafedZYX”
反转整个字符串,”cbafedZYX”操作后是”XYZdefabc”

解释说明:

public class Solution {

public  String LeftRotateString(String str, int n) {
    if (str == null || str.length() == 0) {
      return str;
    }
    if (n < 0 || n >= str.length()) {
      return str;
    }
    char[] strArray = str.toCharArray();
    // 借助反转,分三步
    // 1. 反转要移位的部分
    // 2. 反转其余部分
    // 3. 整体反转
    reverse(strArray, 0, n - 1);
    reverse(strArray, n, strArray.length - 1);
    reverse(strArray, 0, strArray.length - 1);
    return new String(strArray);
  }
  
  /**
   * 反转字符串,两端依次进行交换即完成反转
   * @param str
   * @param start
   * @param end
   */
  private  void reverse(char[] str, int start, int end) {
    while (start < end) {
      swap(str, start, end);
      start++;
      end--;
    }
  }
  
  private  void swap(char[] str, int i, int j) {
    char temp = str[i];
    str[i] = str[j];
    str[j] = temp;
  }
    
}

https://www.jb51.net/article/157258.htm

相关文章

网友评论

      本文标题:剑指 offer 笔记 43 | 左旋转字符串

      本文链接:https://www.haomeiwen.com/subject/rxwtictx.html