- 反转字符串(首尾双指针法)">1、反转字符串(首尾双指针法)
- 反转字符串中的单词 III (部分单词反转技巧,解决部分即解决全部)">2、反转字符串中的单词 III (部分单词反转技巧,解决部分即解决全部)
- 验证回文串">3、验证回文串
- 符串中的第一个唯一字符">4、符串中的第一个唯一字符
- 字符串相加">5、字符串相加
1、反转字符串(首尾双指针法)
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
解答:
/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var reverseString = function(s) {
let l = 0 ;
let r = s.length - 1;
while(l < r){
[s[l], s[r]] = [s[r], s[l]];
l++; r--;
}
return s;
};
2、反转字符串中的单词 III (部分单词反转技巧,解决部分即解决全部)
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例:
输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
解答:
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
const res = []
const len = s.length
let i = 0;
while(i < len){
let k = i;
while(s[i] !== ' ' && i < len){
i++
}
for(let j = i-1; j >= k; j--){
res.push(s[j])
}
if(i !== len) res.push(' ')
i++
}
return res.join('')
};
3、验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
4、符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = "leetcode"
返回 0
s = "loveleetcode"
返回 2
/**
* @param {string} s
* @return {number}
*/
var firstUniqChar = function(s) {
const map = {};
for(let v of s) map[v] = (map[v] || 0) + 1;
for(let i = 0; i < s.length; i++) if(map[s[i]] === 1) return i;
return -1;
};
5、字符串相加
给定两个字符串形式的非负整数 num1
和num2
,计算它们的和。
/**
* @param {string} num1
* @param {string} num2
* @return {string}
*/
var addStrings = function(num1, num2) {
let res=''
if(num1.length > num2.length){
num2=num2.padStart(num1.length,'0')
}else{
num1= num1.padStart(num2.length,'0')
}
let curry=0;
for(let i=num1.length-1; i>=0; i--){
let sum=0;
sum += +num1[i] + +num2[i] + curry;
res = sum%10 + '' + res
curry= (sum/10) | 0;
}
return curry ? curry + res:res
};