锻炼自己的能力,让自己更加熟悉各个api的使用。下面是javascript版本的leetcode题目(字符串入门题组)解法。leetCode地址。1.反转字符串说明编写一个函数,其作用是将输入的字符串反转过来。示例示例1:输入: “hello"输出: “olleh"示例 2:输入: “A man, a plan, a canal: Panama"输出: “amanaP :lanac a ,nalp a ,nam A"实现/** * @param {string} s * @return {string} /var reverseString = function(s) { return s.split(’’).reverse().join(’’)};点评常见写法,转为数组,翻转,变回来。2.颠倒整数说明给定一个 32 位有符号整数,将整数中的数字进行反转。注意: 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。示例示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21实现/* * @param {number} x * @return {number} /var _min = Math.pow(-2,31)var _max = Math.pow(2,31)var reverse = function(x) { var _num = null; if(x<0){ _num = Number(’-’+(Math.abs(x)+’’).split(’’).reverse().join(’’)) }else{ _num = Number(((x)+’’).split(’’).reverse().join(’’)) } if(_num>_max || _num<_min){ return 0; }else{ return _num }};点评看上去和第一题没什么区别。转为字符串,翻转,变成数值。里面需要处理的就是越界以及正负数的问题3.字符串中的第一个唯一字符说明给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。 注意: 您可以假定该字符串只包含小写字母。示例示例1:s = “leetcode"返回 0.示例2:s = “loveleetcode”,返回 2.实现/* * @param {string} s * @return {number} /var firstUniqChar = function(s) { for(var i = 0 ; i < s.length;i++){ if(s.indexOf(s[i]) == s.lastIndexOf(s[i])){ return i } } return -1};点评解法不是很好,会导致遍历很多次,想法就是前后找,如果index一致就证明没重复 最快的方法当然是把当前的存在map里面,然后计数,再遍历一遍map就ok。4.有效的字母异位词说明给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。说明: 你可以假设字符串只包含小写字母。进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?示例示例 1:输入: s = “anagram”, t = “nagaram"输出: true示例 2:输入: s = “rat”, t = “car"输出: false实现/* * @param {string} s * @param {string} t * @return {boolean} /var isAnagram = function(s, t) { var _sArr = {}; var _tArr = {}; if(s.length != t.length) return false; for(var i = 0;i<s.length;i++){ if(!_sArr[s[i]]) _sArr[s[i]] = 0; _sArr[s[i]]++ if(!_tArr[t[i]]) _tArr[t[i]] = 0; _tArr[t[i]]++ } for(var i in _sArr){ if(_sArr[i]!=_tArr[i]){ return false; } } return true;};点评这个就是通过计数,然后判断是否元素都一样多。5.验证回文字符串说明给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明: 本题中,我们将空字符串定义为有效的回文串。示例示例 1:输入: “A man, a plan, a canal: Panama"输出: true示例 2:输入: “race a car"输出: false实现/* * @param {string} s * @return {boolean} /var isPalindrome = function(s) { var _s = s.replace(/[^a-z0-9]/gi,’’).toLowerCase(); return _s.split(’’).reverse().join(’’) == _s};点评通过正则把不要的字符都删掉,转化为小写,翻转比对。6.字符串转整数(atoi)说明实现 atoi,将字符串转为整数。在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。若函数不能执行有效的转换,返回 0。说明:假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。示例示例 1:输入: “42"输出: 42示例 2:输入: " -42"输出: -42解释: 第一个非空白字符为 ‘-’, 它是一个负号。 我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。示例 3:输入: “4193 with words"输出: 4193解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。示例 4:输入: “words and 987"输出: 0解释: 第一个非空字符是 ‘w’, 但它不是数字或正、负号。 因此无法执行有效的转换。 示例 5输入: “-91283472332"输出: -2147483648解释: 数字 “-91283472332” 超过 32 位有符号整数范围。 因此返回 INT_MIN (−231) 。实现/* * @param {string} str * @return {number} /var myAtoi = function(str) { var _num = parseInt(str) || 0 if(_num < (Math.pow(-2,31))){ return (Math.pow(-2,31)) }else if(_num >= (Math.pow(2,31))){ return (Math.pow(2,31)-1) }else{ return _num }};点评这个没什么好说的,判断边界,然后parseInt7.实现strStr()说明给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。示例示例 1:输入: haystack = “hello”, needle = “ll"输出: 2示例 2:输入: haystack = “aaaaa”, needle = “bba"输出: -1实现/* * @param {string} haystack * @param {string} needle * @return {number} /var strStr = function(haystack, needle) { return haystack.indexOf(needle)};点评也没什么说的吧,正则或者indexOf都可以实现8.数数并说说明报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:1. 12. 113. 214. 12115. 1112211 被读作 “one 1” (“一个一”) , 即 11。 11 被读作 “two 1s” (“两个一”), 即 21。 21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。给定一个正整数 n ,输出报数序列的第 n 项。 注意:整数顺序将表示为一个字符串。示例示例 1:输入: 1输出: “1"示例 2:输入: 4输出: “1211"实现/* * @param {number} n * @return {string} /var countAndSay = function(n) { var _str = ‘1’; for(var i=1;i<n;i++){ _str = _str.match(/1+|2+|3+|4+|5+|6+|7+|8+|9+/g).map(v=>’’+v.length+v[0]).join(’’); } return _str};点评我的想法是选出连续的同字符,然后把该字符串变成长度加字符,再拼回去9. 最长公共前缀说明编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “"。说明: 所有输入只包含小写字母 a-z 。示例示例 1:输入: [“flower”,“flow”,“flight”]输出: “fl"示例 2:输入: [“dog”,“racecar”,“car”]输出: ““解释: 输入不存在公共前缀。实现/* * @param {string[]} strs * @return {string} */var longestCommonPrefix = function(strs) { var _arr = (strs[0]||’’).split(’’).map((v,i)=>strs[0].slice(0,i+1)).reverse(); for(var i = 1;i<strs.length;i++){ // if(_arr.length == 0) break; while(_arr.length){ var _index = strs[i].indexOf(_arr[0]); if(_index != 0){ _arr.shift() }else{ break; } } } return _arr[0] || ‘’};点评想法是做一个公共前缀数组,遍历,如果有不满足的,就操作这个前缀数组,直到最后,剩下的就是满足的。取最大的一个。