Day8 反转字符串|反转字符串II|翻转字符串里的单词||左旋转字符串

1.反转字符串 leetcode344

解题思路

对于字符串,我们定义两个指针(也可以说是索引下标)

一个从字符串前面,

一个从字符串后面,

两个指针同时向中间移动,交换元素

function reverseString(s) {
  let left = 0;
  let right = s.length - 1;
  let temp = '';
  while (left < right) {
    temp = s[left];
    s[left] = s[right];
    s[right] = temp;
    left++;
    right--;
  }
}

2.反转字符串II leetcode541

注意点:这个反转字符串有特殊的规则,题目的意思是每隔k个 反转一次,再相隔k个,不反转,以此类推

var reverseStr = function (s, k) {
  let result = '';
  // 第一次可以反转
  let isReverse = true
  for (let i = 0; i < s.length; i += k) {
    // 截取每次需要的字符串看是否旋转
    let str = s.slice(i, i + k)
    result += isReverse ? str.split('').reverse().join('') : str
    // 一次反转一次不反转,以此类推
    isReverse = !isReverse
  }
}

3.翻转字符串里的单词 leetcode151

解题思路

1.先去掉多余的空格,保留每个字母之前的空格(双指针)

2.全部反转整个字符串

3.逐次反转每个空格前后的单词

注意:先整体反转在局部反转

var reverseWords = function (s) {
  // 去除多余空格
  let arr = s.split('');
  let slow = 0;
  let fast = 0;
  while (fast < arr.length) {
    // 如果第一个字符是空格,则去除掉,或者当前是空格且前一个是空格,则去掉连续多余的空格
    if (arr[fast] === ' ' && (fast === 0 || arr[fast - 1] === ' ')) {
      fast++
    } else {
      arr[slow] = arr[fast];
      slow++;
      fast++
    }
  }
  // 移除末尾空格
  arr.length = arr[slow - 1] === ' ' ? slow - 1 : slow;
  // 反转全部单词
  arr.reverse();
  // 在逐次反转每个空格前后的单词
  let start = 0;
  for (let i = 0; i <= arr.length; i++) {
    // 每次空格前,需要反转一次。到最后没有空格了,end就到最后一个字符
    if (arr[i] === ' ' || i === arr.length) {
      reverseStr(arr, start, i - 1);
      // 下一个反转的起始点在空格之后
      start = i + 1;
    }
  }
  return arr.join('');
};

var reverseStr = function (arr, start, end) {
    while (start < end) {
        [arr[start], arr[end]] = [arr[end], arr[start]];
        start++;
        end--
    }
}

4.剑指Offer58-II.左旋转字符串

// 先全部旋转,在旋转前length-n个,在旋转后面的length-n到length-1

先整体,在局部

// 先全部旋转,在旋转前length-n个,在旋转后面的length-n到length-1

// gfedcba=》cdefgba=》cdefgab

var reverseLeftWords = function (s, n) {
  function reverseWords(strArr, start, end) {
    let temp;
    while (start < end) {
      strArr[strArr[start], start[end]] = strArr[strArr[end], start[start]]
      start++;
      end--;
    }
  }
  let strArr = s.split('');
  let length = strArr.length;
  reverseWords(strArr, 0, length - 1);
  reverseWords(strArr, 0, length - n - 1);
  reverseWords(strArr, length - n, length - 1);
  return strArr.join('');
};

解法二

 拼接两个字符串,截取符合要求的部分

// 拼接两个字符串,截取符合要求的部分
function reverseLeftWords(s, n) {
    return (s+s).slice(n,s.length+n);
};

你可能感兴趣的:(数据结构)