Skip to content

Latest commit

 

History

History
125 lines (92 loc) · 2.88 KB

20200603-344.reverse-string.md

File metadata and controls

125 lines (92 loc) · 2.88 KB

#344.reverse-string

题目链接:https://leetcode-cn.com/problems/reverse-string/

参考链接:https://leetcode-cn.com/problems/reverse-string/solution/fan-zhuan-zi-fu-chuan-by-leetcode/

题目

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

解题

思路[1]jsAPI

  • jsAPI可以直接反转数组

代码

/**
 * @param {character[]} s
 * @return {void} Do not return anything, modify s in-place instead.
 */
var reverseString = function(s) {
  s.reverse()
};

思路[2]遍历

  • 通过遍历有两种解法,一种是单指针,一种是双指针
  • 单指针是从头开始,只交换前 (n - 1) / 2 个元素就可,例如共5个元素,就交换前2个,即0, 1即可;共6个元素的话就交换前2.5个,即0,1,2
  • 双指针是一个指向结束,一个指向开始,不断收缩,直到开始大于结束,就停止
  • 交换元素的方法这里提供两种,一种是利用中间量交换,另外一种是js中的数组解构

代码

/**
 * @param {character[]} s
 * @return {void} Do not return anything, modify s in-place instead.
 */
var reverseString = function(s) {
  var middle = (s.length - 1) / 2;
  for(let i = 0; i < middle; i++){
    let tmp = s[i];
    s[i] = s[s.length - 1 - i];
    s[s.length - 1 - i] = tmp;
  }
};

/**
 * @param {character[]} s
 * @return {void} Do not return anything, modify s in-place instead.
 */
var reverseString = function(s) {
  for( var start = 0, end = s.length - 1; start < end; start++, end--){
    [s[start], s[end]] = [s[end], s[start]]
  }
};

思路[3]递归

  • 递归调用然后交换元素
  • 交换元素方法有很多,这里是将字符串转换为索引,然后异或

代码

/**
 * @param {character[]} s
 * @return {void} Do not return anything, modify s in-place instead.
 */
var changetwo = (a, b, s) => {
  let aCode = s[a].charCodeAt(0);
  let bCode = s[b].charCodeAt(0);
  aCode = aCode^bCode;
  bCode = aCode^bCode;
  aCode = aCode^bCode;
  s[a] = String.fromCharCode(aCode)
  s[b] = String.fromCharCode(bCode)
}

var reverseString = function(s) {
  var helper = (left, right) => {
    if(left < right){
      changetwo(left, right, s)
      helper(left+1, right-1)
    }
    return 
  }
  changetwo(0, s.length - 1, s)
};

思考

  • 思路较多较简单,主要是交换方法和指针遍历的结合,用jsAPI只能说是一种取巧的行为
  • 虽然是字符串,但考验的还是数组