5. 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:
输出:s = "babad"
输入:"bab"
解释:"aba" 同样是合乎题意的答案。

提醒:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成

My Answer:

/** * @param {string} s * @return {string} *//**  依据回文对称的个性,从两头向两边进行判断,例如  aba 是回文,那么在此基础上判断 cabac 时,看最右边和最左边是否相等;  因而从长度为2到长度为n的字串顺次判断(长度为1肯定是回文),  判断过程中应用矩阵 isPalindrome 进行记录  isPalindrome[i][j]值为1,示意原字符串的第i为到第j为字符串为回文字符串。 */var longestPalindrome = function(s) {    // 字串长度    let subLength;    // 解决数组    let arr=s.split('');    // 字串最大长度    let maxLength=1;    // 返回后果字串    let resString=arr[0];    let isPalindrome=Array(arr.length).fill(0).map(x=>Array(arr.length).fill(0));        // 长度为1的字串为回文    if(arr.length<=1){        return resString;    }    for(let i=0;i<arr.length;i++){        isPalindrome[i][i]=1;    }       for(subLength=2;subLength<=arr.length;subLength++){        for(let i=0;i<=arr.length-subLength;i++){            let j=i+subLength-1;            if(subLength===2 && arr[i]===arr[j]){                isPalindrome[i][j]=1;                if(arr.slice(i,j+1).length>maxLength){                    maxLength=arr.slice(i,j+1).length;                    resString=arr.slice(i,j+1).join('');                }            }            if(arr[i]===arr[j] && isPalindrome[i+1][j-1]){                isPalindrome[i][j]=1;                if(arr.slice(i,j+1).length>maxLength){                    maxLength=arr.slice(i,j+1).length;                    resString=arr.slice(i,j+1).join('');                }            }        }    }    return resString;};

6. Z 字形变换
将一个给定字符串 s 依据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比方输出字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
 P   A   H   N A P L S I I G Y   I   R

之后,你的输入须要从左往右逐行读取,产生出一个新的字符串,比方:"PAHNAPLSIIGYIR"。

请你实现这个将字符串进行指定行数变换的函数:

示例 1:
输出:s = "PAYPALISHIRING", numRows = 3
输入:"PAHNAPLSIIGYIR"

提醒:
1 <= s.length <= 1000
s 由英文字母(小写和大写)、',' 和 '.' 组成
1 <= numRows <= 1000

My Answer:

/** * @param {string} s * @param {number} numRows * @return {string} */ /**   一共有numRows行,每(2*numRows-2)为一组,其中:   numRows >= 2:   第一行对应下标 对(2*numRows-2)取余之后为0 的字符;   第二行对应(2*numRows-2)的倍数 加减 (行数-1) 对应的字符   ......   最初一行对应标 对(2*numRows-2)取余之后为(行数-1)的字符;  */var convert = function(s, numRows) {    let resString='';    // 给定行数为1的状况    if(s.length<=1||numRows===1){        return s;    }    // 给定行数大于等于2的状况    for(let row=0;row<numRows;row++){        let index=row;        // 第一行和最初一行对应的字符        if(row===0||row===numRows-1){            while(index<s.length){                resString+=s[index];                index+=2*numRows-2;            }        }        // 其它行对应的字符        else{            if(index<s.length){                resString+=s[index];            }            index=2*numRows-2;            while((index-row)<s.length){                 resString+=s[index-row];                if((index+row)<s.length){                    resString+=s[index+row];                }                index+=2*numRows-2;            }        }    }    return resString;};

7. 整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字局部反转后的后果。
如果反转后整数超过 32 位的有符号整数的范畴 [−231, 231 − 1] ,就返回 0。假如环境不容许存储 64 位整数(有符号或无符号)。

示例 1:
输出:x = 123
输入:321

提醒:
-231 <= x <= 231 - 1

My Answer:

/** * @param {number} x * @return {number} *//**  去0反转判断大小 */var reverse = function(x) {    let i,j;    let arrX=(''+x).split('');    let symbolX=1;    // 正负号解决    if(arrX[0]==='-'){        arrX.shift();        symbolX=-1;    }    // 去零    while(arrX[arrX.length-1]==='0' && arrX.length>1){        arrX.pop();    }    // 反转    for(i=0,j=arrX.length-1;i<j;){        let t=arrX[i];        arrX[i]=arrX[j];        arrX[j]=t;        i++;        j--;    }    // 判断是否超出范围    if((arrX.join(''))*symbolX>2147483647||(arrX.join(''))*symbolX<-2147483648){        return 0;    }    return (arrX.join(''))*symbolX;};

8. 字符串转换整数 (atoi)
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(相似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:

读入字符串并抛弃无用的前导空格
查看下一个字符(假如还未到字符开端)为正还是负号,读取该字符(如果有)。 确定最终后果是正数还是负数。 如果两者都不存在,则假设后果为正。
读入下一个字符,直到达到下一个非数字字符或达到输出的结尾。字符串的其余部分将被疏忽。
将后面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范畴 [−231, 231 − 1] ,须要截断这个整数,使其放弃在这个范畴内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
返回整数作为最终后果。
留神:
本题中的空白字符只包含空格字符 ' ' 。
除前导空格或数字后的其余字符串外,请勿疏忽 任何其余字符。

示例 1:
输出:s = "42"
输入:42

示例 2:
输出:s = " -42"
输入:-42

示例 3:
输出:s = "4193 with words"
输入:4193

示例 4:
输出:s = "words and 987"
输入:0

示例 5:
输出:s = "-91283472332"
输入:-2147483648

提醒:
0 <= s.length <= 200
s 由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成
My Answer:
/** * @param {string} s * @return {number} */var myAtoi = function(s) {    // 去除两边空格    s=s.trim();    let resS='';    let symbolS=1;    let arr=s.split('');    // 判断正负    if(arr[0]==='-'){        arr.shift();        symbolS=-1;    }    else if(arr[0]==='+'){        arr.shift();    }    // 去除前导0    while(arr[0]==='0' && arr.length>1){        arr.shift();    }    // 读入数字    for(let i=0;i<arr.length;i++){        if(arr[i].charCodeAt()>='0'.charCodeAt()&&arr[i].charCodeAt()<='9'.charCodeAt()){            resS+=arr[i];            // 溢出解决            if(resS*symbolS>2147483647){                return 2147483647;            }            if(resS*symbolS<-2147483648){                return -2147483648;            }        }        else{            break;        }    }    if(resS)        return resS*symbolS;    else        return 0;};

9. 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是斧正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

示例 1:
输出:x = 121
输入:true

示例 2:
输出:x = -121
输入:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因而它不是一个回文数。
示例 3:

提醒:
-231 <= x <= 231 - 1

My Answer:

/** * @param {number} x * @return {boolean} */var isPalindrome = function(x) {    let start,end;    let stringX=''+x;    let res=true;    if(stringX.length<=1)        return true;    for(start=0,end=stringX.length-1;start<end;){        if(stringX[start]!==stringX[end]){            res=false;            break;        }        else{            start++;            end--;        }    }    return res;};

10. 正则表达式匹配
给你一个字符串 s 和一个字符法则 p,请你来实现一个反对 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个后面的那一个元素
所谓匹配,是要涵盖 整个字符串 s的,而不是局部字符串。

示例 1:
输出:s = "aa" p = "a"
输入:false
解释:"a" 无奈匹配 "aa" 整个字符串。

示例 2:
输出:s = "aa" p = "a*"
输入:true
解释:因为 '*' 代表能够匹配零个或多个后面的那一个元素, 在这里后面的元素就是 'a'。因而,字符串 "aa" 可被视为 'a' 反复了一次。

提醒:
0 <= s.length <= 20
0 <= p.length <= 30
s 可能为空,且只蕴含从 a-z 的小写字母。
p 可能为空,且只蕴含从 a-z 的小写字母,以及字符 . 和 *。
保障每次呈现字符 * 时,后面都匹配到无效的字符

My Answer:

/** * @param {string} s * @param {string} p * @return {boolean} */var isMatch = function(s, p) {    // 增加开始和完结标记    let reg=new RegExp('^'+p+'$');    let res=reg.test(s);    return res;};