剑指OFFER----58-2、左旋转字符串(js实现)

题目

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


思路

  1. 通过两个长度的字符串进行截取,”abcXYZdef” + ”abcXYZdef” = ”abcXYZdefabcXYZdef”,在其中通过substr或者for循环来截取,时间复杂度O(n)
  2. 通过数学公式 YX = (X翻转 * Y翻转)^翻转

// 解法一
function LeftRotateString(str, n)
{
    // write code here
    if (str === null || str.length === 0) {
        return ''
    }
    n = n % str.length
    str += str
    return str.substr(n, str.length / 2) 
}
// 解法二
function LeftRotateString(str, n)
{
    // write code here
    if (!str) {
        return ''
    }
    let letterArr = []
    // 原生实现Array.reverse()方法
    let reverse = (arr, i, j) => {
        while (i < j) {
            let temp = arr[i]
            arr[i] = arr[j]
            arr[j] = temp
            i++
            j--
        }
    }
    // 原生实现Array.join()方法
    let join = (arr, fill) => {
        let result = ''
        for (let i = 0; i < arr.length - 1; i++) {
            result += arr[i]
            result += fill
        } 
        result += arr[arr.length - 1]
        return result
    }
    // 分割字符串为字符数组
    for (let i = 0; i < str.length; i++) {
        letterArr.push(str[i])
    }
    reverse(letterArr, 0, n-1)
    reverse(letterArr, n, letterArr.length - 1)
    reverse(letterArr, 0, letterArr.length - 1)
    return join(letterArr, '')
}

你可能感兴趣的:(剑指OFFER,剑指OFFER(JS版),剑指OFFER)