// var lengthOfLongestSubstring = function(s) { // let n = s.length; // let set = new Set(); // let ans = 0, i = 0, j = 0; // while (i < n && j < n) { // if (!set.has(s[j])) { // set.add(s[j++]); // ans = Math.max(ans, j - i); // } else { // set.delete(s[i++]); // } // } // return ans; // };
//时间复杂度:O(2n) = O(n)O(2n)=O(n),在最糟糕的情况下,每个字符将被 ii 和 jj 访问两次。 //空间复杂度:O(min(m, n))O(min(m,n)),与之前的方法相同。滑动窗口法需要 O(k)O(k) 的空间,其中 kk 表示 Set 的大小。而Set的大小取决于字符串 nn 的大小以及字符集/字母 mm 的大小。
function StrLen(str) { let result = 1 //最终要返回的结果的初始值 let norepeatStr = '' //用于存放无重复字符串 let len = str.length for (let i = 0; i < len; i++) { //charAt()获取的是字符串索引对应的具体字符 let specStr = str.charAt(i) //indexOf()查找的是某个字符第一次出现并返回这个索引值,若没有这个字符,返回-1 let index = norepeatStr.indexOf(specStr) if (index === -1) { //将遍历得到的字符(未重复)拼接在norepeatStr后面 norepeatStr = norepeatStr + specStr result = result < norepeatStr.length ? norepeatStr.length : result } else { //若遇到重复的字符,那么将已出现在norepeatStr里的字符删除,并将新的(重复的添加到末尾) norepeatStr = norepeatStr.substr(index + 1) + specStr } } return result }
function func() { let a = '333333333333333333333333333' let b = '9999999999999999999' let n1 = a.length let n2 = b.length for (let i = 0; i < Math.max(n1, n2) - Math.min(n1, n2); i ++) { if (n1 > n2) b = '0' + b if (n2 > n1) a = '0' + a } a = a.split('').reverse() b = b.split('').reverse() //split()基于指定的分隔符将一个字符串分割成多个子字符串并将结果放在一个数组中 //reverse()反转数组项的顺序(加法计算顺序) //现在a,b数组中存储着相同个数的大数字的逆顺序拆解
let n = Math.max(n1, n2) let result = Array.apply(this, Array(n)).map((item, i) => { return 0 }) //生成一个长度为n的每个元素都为0的数组(用来保存最终结果)
for (let k = 0; k < n; k ++) { let temp = parseInt(a[k]) + parseInt(b[k]) if (temp > 9) { result[k] += temp - 10 result[k+1] = 1 } else { result[k] += temp } }
var arr = ['foo','bar','hello','world']; var count = 1; function getStr(a){ for (var i = 0; i < arr.length; i++) { // indexOf 是es6数组的方法,如果不存在返回-1,存在返回下标 if(a.indexOf(arr[i])<0){
5、公司最近新研发了一种产品,共生产了 n 件。有 m 个客户想购买此产品,已知每个顾客出价。为了确保公平,公司决定要以一个固定的价格出售产品。每一个出价不低于要价的客户将会得到产品(每人只买一个),余下的将会被拒绝购买。请你找出能让公司利润最大化的售价。—京东前端面试题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
let n = 3 let m = 4 let arr = [2, 8, 10, 7] let key = 0, max = 0 arr = arr.sort( (a, b) => { return a - b //升序 }) if (n < m) { arr = arr.slice(m - n) //截取出价高的人 } for (let i = 0; i < arr.length; i ++) { if (max < arr[i] * (arr.length - i)) { max = arr[i] * (arr.length - i) key = arr[i] } }
function parseQueryString(url) { var pos = url.indexOf("?") var obj = {} if (pos != -1) { var urlString=url.slice(pos+1) var urlArr = urlString.split("&") var keyValue = [] for (var i = 0; i < urlArr.length; i++) { keyValue = urlArr[i].split("=") obj[keyValue[0]]=keyValue[1] } } return obj }
function palindrome(str) { let str1 = str.replace(/[^0-9a-zA-Z]/g,"").toLowerCase() // 去掉标点符号,转化成小写,比较参数一 let str2 = str1.split("").reverse().join("") // 翻转字符串,比较参数二 if (str1 === str2) { return true } else return false } console.log(palindrome("aBc,./1d42--==EFG0 00 h0 ';00gfE' ./.24d 1cBA")) // 输出结果:true
解题思路 去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。
10、确保字符串的每个单词首字母都大写,其余部分小写。——搜狐前端面试题
1 2 3 4 5 6 7 8 9
function titleCase(str) { let aStr = str.toLowerCase().split(" ") // 转小写,分割成字符串数组 for (let i = 0; i < aStr.length; i ++) { aStr[i] = aStr[i][0].toUpperCase() + aStr[i].slice(1) // 重新组合字符串元素 } let oString = aStr.join(" ") //转成字符串 return oString } console.log(titleCase("I'm a title Case")) // 输出结果为 I'm A Title Case