1、反转字符串(首尾双指针法)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

  1. 输入:["h","e","l","l","o"]
  2. 输出:["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、字符串相加

给定两个字符串形式的非负整数 num1num2 ,计算它们的和。

/**
 * @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
};