1.反转字符串

方法1:前后指针交换法
关键:以Math.floor(s.length / 2)作为分界线,交换s[i]与s[s.length - i - 1]的值
var reverseString = function (s) {let mid = Math.floor(s.length / 2);for (let i = 0; i < mid; i++) {console.log(s[i], s[s.length - i - 1]);let temp = s[i];s[i] = s[s.length - i - 1];s[s.length - i - 1] = temp;}return s;};
方法2:reverse()
s.reverse()
2.整数反转

思路:双指针,前后交换,while循环遍历
注意:如果是负数开头,那么left从1开始
function(x) {// 替换 left 和 right 的值// 注意负数开头let arr = x.toString().split('')let right = arr.length - 1let left = x < 0 ? 1 : 0while(left < right) {let temp = arr[left]arr[left] = arr[right]arr[right] = tempright--left++}// 判断是否在 [-2^31, 2^31-1]内let num = Number(arr.join(''))if (num < -(Math.pow(2, 31)) || num > (Math.pow(2, 31) - 1)) {return 0}return num};
3.字符串中的第一个唯一字符

方法1:
- 遍历一遍数组,通过hashMap记录item以及count次数
再遍历一遍hashMap找到第一个count为1的item
var firstUniqChar = function(s) {let arr = s.split('')let map = new Map()for(let i = 0; i < arr.length; i++) {let count = map.get(s[i])if (count) {map.set(s[i], ++count)} else {map.set(s[i], 1)}}for (let [key, value] of map) {if (value === 1) {return arr.indexOf(key)}}return -1};
方法2:通过indexOf以及lastIndexOf相等来判断第一个不重复的item
function(s) {let arr = s.split("")for (let i = 0; i < s.length; i++) {if (arr.indexOf(s[i]) === arr.lastIndexOf(s[i])) {return arr.indexOf(s[i])}}return -1};
4.有效的字母异位词(两个字符串出现数量是否相同)

方法1:hashMap方式遍历s,记录item以及出现的次数
- 遍历t,消除hashMap上的count,如果最后的时候还存在count,说明不相等
补充:需要先判断length一致
var isAnagram = function(s, t) {let map = new Map()if (s.length !== t.length) {return false}for (let i = 0; i < s.length; i++) {let count = map.get(s[i])if (count) {map.set(s[i], ++count)} else {map.set(s[i], 1)}}for (let i = 0; i < t.length; i++) {let count = map.get(t[i])if (count) {map.set(t[i], --count)}}for (let [key, value] of map) {if (value > 0) {return false}}return true};
方法2:通过for循环t+replace的方法,清空s数组,看看剩余s的长度
function(s, t) {if (s.length !== t.length) return falsefor(let i = 0; i < t.length; i++) {s = s.replace(t[i], "")}return !Boolean(s.length)};
5.验证回文字符串
.
思路:
- 先通过正则
/[^a-zA-Z0-9]/g替换掉非字母和数字的字符串 通过双指针方式,对比前后的字符串是否一致,只要有一个不一致则return false
/*** @param {string} s* @return {boolean}*/var isPalindrome = function(s) {if (!s) return true// 将非字符串和数字的清除掉s = s.replace(/[^a-zA-Z0-9]/g, '').toLowerCase()for (let i = 0; i < s.length / 2; i++) {if (s[i] === s[s.length - i - 1]) {continue} else {return false}}return true}
7.实现strStr()(字符串搜索)

方法1:采用 indexOf或者 search apivar strStr = function (haystack, needle) {return haystack.indexOf(needle)};
方法2:遍历+双指针比对
遍历 haystack,记录指针 i
- 每次遍历 haystack 时,比对 haystack后面几项是否与 needle相等
function(haystack, needle) {if (needle === "") return 0let i = 0 // haystack 指针let j = 0 // needle 指针while(i < haystack.length) {// 如果找到开始的相等的字符串,就继续往后比对if (haystack[i] === needle[j]) {i++j++} else {// 否则,将 i 重置到开始相等的下一位i = i - j + 1j = 0}// 如果全部相等if (j === needle.length) {return i - j}}return -1};
方法3(推荐):遍历 haystack,截取后面的needle.length项,比对是否相同
function(haystack, needle) {if (needle === "") return 0let len = needle.lengthfor (let i = 0; i < haystack.length; i++) {let str = haystack.substr(i, len)if (str === needle) {return i}}return -1};
9.最长公共前缀
找到传入字符串数组的最长公共前缀
最长公共前缀
var longestCommonPrefix = function(strs) {let res = ""// 找到最短的 strlet minStr = ""for(let i = 0; i < strs.length; i++) {if (minStr) {if (strs[i].length < minStr.length) {minStr = strs[i]}} else {minStr = strs[i]}}for (let i = 0; i < minStr.length; i++) {for (let j = 0; j < strs.length; j++) {if (strs[j][i] !== minStr[i]) {return res}}res += minStr[i]}return res};
