这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
反转字符串
题目
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
题解
思路一:
找到中间点,设定中间点的左右两边位置为左右指针,分别向两边扩散交换。
中间点需要根据数组长度的奇偶来判断。偶数,左右指针就指向长度一半的前一个位置和一半的位置;奇数,左右指针分别指向中间数的左右两边的位置。
思路二:
设定左右指针,分别指向头和尾。两个指针相向而行,互相交换,当左右指针相遇或左指针超过右指针时,跳出循环,返回数组。
代码
思路一:
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