15天算法入门(四)

407 阅读1分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

image.png

反转字符串

题目

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

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

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

 

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

题解

思路一:
找到中间点,设定中间点的左右两边位置为左右指针,分别向两边扩散交换。
中间点需要根据数组长度的奇偶来判断。偶数,左右指针就指向长度一半的前一个位置和一半的位置;奇数,左右指针分别指向中间数的左右两边的位置。

image.png 思路二:
设定左右指针,分别指向头和尾。两个指针相向而行,互相交换,当左右指针相遇或左指针超过右指针时,跳出循环,返回数组。

image.png

代码

思路一:

var reverseString = function (s) {
    let l, r
    if (s.length % 2 === 0) {
        l = (s.length >> 1) - 1
        r = s.length >> 1
    } else {
        l = (s.length >> 1) - 1
        r = (s.length >> 1) + 1
    }
    while (l >= 0 && r < s.length) {
        swap(s, l--, r++)
    }
    return s
};
function swap(arr, i, j) {
    let temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp
}

思路二:

var reverseString = function (s) {
    let l = 0, r = s.length - 1
    while (l < r) {
        swap(s, l++, r--)
    }
    return s
};
function swap(arr, i, j) {
    let temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp
}

反转字符串中的单词III

题目

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。  

示例:
输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

题解

这题主要考察字符串与数组之间切换,还有数组的反转。
先将字符串按空格分割成数组,然后在每个小段字符串中,将其变成数组反转,在拼成字符串。最后用空格将其再拼接成一个长的字符串。

代码

var reverseWords = function (s) {
    let arr = s.split(' ')
    let res = []
    for (let i = 0; i < arr.length; i++) {
        res.push(arr[i].split('').reverse().join(''))
    }
    return res.join(' ')
};

题目来源:leetcode