记录几个比较典型的js面试题
1 将类似 border-bottom-color的字符串转成驼峰形式的字符串
方法1 思路:将字符串以‘-’为分割点 分割成数组,利用字符串的charAt(0)定位到首字母,利用字符串的toUpperCase()转成大写,字符串的substring(1)获取到字符串除了第一位剩余的字符,最后大写的首字母与剩余字符链接即可
function test(str) {
var array=str.split("-");
for(var i=1;i<array.length;i++){
array[i]=array[i].charAt(0).toUpperCase()+array[i].substring(1)
}
return array.join("")
}
alert(test('border-bottom-color'))
方法2 正则 思路:正则匹配横线‘-’和其后的字母,然后借助replace方法将匹配到的子项转成
function test2(str) {
var reg=/-(\w)/g
return str.replace(reg,function (s0,s1) {//s0是正则匹配到的完整项-吧,
// -c,s1是正则里的子项 就是小括号括起来的那一项b,c
return s1.toUpperCase()
})
}
方法3 思路将字符串转成数组,然后遍历数组,遇到‘-’就删除,将下一个对象转成大写,最后连起来就可以了
function test(str) {
var strArr=str.split("");
for(var i=0;i<strArr.length;i++){
if(strArr[i]=='-'){
strArr.splice(i,1)
if(i<strArr.length){
strArr[i]=strArr[i].toUpperCase()
}
}
}
return strArr.join("")
}
var str="border-bottom-color-"
alert(test(str))
2 查找字符串中出现最多的字符及个数
方法1 思路:利用对象的key是不可重复的这一特点,首先把字符串转成对象(map) 类似{‘s’:['s','s','s'],'d':['d','d']} 然后遍历计算出value最长的一项即可
var str="ssddffjcjdewddjkdjdjdjkdjkjkj";
function test(str) {
/*
* 思路:利用对象的key是不可重复的,首先把字符串转成对象形式{"s":["s","s"],"d":["d","d","d"]}
* */
var obj={};
var charstr="";
var charnum=0;
for(var i=0;i<str.length;i++){
if(obj[str.charAt(i)]){
obj[str.charAt(i)].push(str.charAt(i))
}else{
obj[str.charAt(i)]=[str.charAt(i)]
}
}
/*
* 然后遍历对象 查出数组最长的一项,它的key就是出现最多的字符 它的长度就是出现的次数
* */
for(y in obj){
debugger
if(obj[y].length>charnum){
charnum=obj[y].length
charstr=y
}
}
return {
"charstr":charstr,
"charnum":charnum
}
}
console.log(test("ssddffjcjdewddjkdjdjdjkdjkjkj"))
方法2 正则:
var str="ssddffjcjdewddjkdjdjdjkdjkjkj";
function test(str) {
/*将str转成数组 利用数组的sort方法将相同的字符放到一起然后在join()成字符串*/
var str=str.split('').sort().join('')
console.log(str)//cdddddddddeffjjjjjjjjjkkkkssw
var reg=/(\w)\1+/g // \1表示重复的字符
var num=0;
var char=""
str.replace(reg,function (s0,s1) {
alert(s0)
alert(s1)
if(s0.length>num){
num=s0.length;
char=s1;
}
})
console.log("出现最多的字母是"+char+" 出现的次数是"+num)//出现最多的字母是d 出现的次数是9
}
test("ssddffjcjdewddjkdjdjdjkdjkjkj")
3 将数字56891203256加上,分隔符转成货币形式的数字 56,891,203,256
方法1 将数字长度模3取余,根据余数将数字分割成56和891203256,将891203256转成三位一组的数组,然后和之前的56一起join
var str="56891203256"; function test(str) { var index=(str.length)%3// 0 1 2 var arr=[]; if(index!=0){ var first=str.substring(0,index) str=str.substring(index) arr.push(first) } var num=0; for(i=0;i<str.length;i++){ num++ if(num==3){ var tem=str.substring(i-2,i+1) arr.push(tem) num=0; } } console.log(arr.join(","))//56,891,203,256 } test(str)
方法2 正则
(?=) 前向声明 /a(?=b)/g 查找a前面是b的a
(?!) 反前向声明 /a(?!b)/g 查找a前面不是b的a
\b 代表一个位置 指的是字符串的开始、结束和空格的位置
(?!\b)匹配非开始结束位置
var str="156891203256";
function test(str) {
var reg=/(?=(?!\b)(\d{3})+$)/g
return str.replace(reg,",")
}
alert(test(str))
3 有a,b两个值 不借助第三个变量 交换a b两个的值
思路:既然不能借助第三方 就只能在a b之间做文章 a b可能是数字 可能是字符串
如果a b 是数字 :
a=a+b
b=a-b
a=a-b 即可
如果a b是字符串 则上面都方法用不了
类似数字的加法 我们可以考虑到数组
a=[a,b]
b=a[0]
a=a[1]
方法2 利用es6的解构赋值
var a="hello";var b="world"
var [a,b]=[b,a]
console.log(a)//world
console.log(b)//hello
4 有一个数字n 不允许使用for循环 写一个方法生成数组[0,1,2...n] 如果n是5 则生成数组[1,2,3,4,5]
方法1
思路:不允许使用for循环,生成一个数组?除了循环 我们还可以用递归,解决这个问题的办法就是从递归入手
var num=5
function test(num) {
var arr=[];
var result=(function(){
debugger
if(num>=0){
arr.unshift(num)
num--
arguments.callee()//当递归调用自身方法 方法没有名字时 可以这么写
}
return arr
})()
alert(result)
return result;
}
alert(test(num))
或者
function test(num) {
var arr=[];
function digui(){
debugger
if(num>=0){
arr.unshift(num)
num--
digui()
}
return arr
}
digui()
return arr;
}
方法2
思路:利用string的replace(reg,function(){}),正则匹配几次,就会回调几次回调函数
对于n,我们要生成的数组长度就是n+1,我们创建一个n+1长度的数组arr=[],arr.length=n+1 假设n=5 arr= [ , , , , ,]
利用数组的join方法将数组转成字符相同的
function test(n){
var arr=[]
var result=[]
arr.length=n+1;
var str=arr.join("a");
console.log(str)//aaaaa(5个a)
var reg=/a/g
str.replace(reg,function () {
result.unshift(n)
n--
})
result.unshift(0)
return result
}
alert(test(n))
如果看这篇文章的小伙伴有其他的解决办法思路 欢迎指导(会持续更细)