牛客前端代码刷题集

1 数组求和

题目描述: 有一个数组为[1, 2, [3, 4], [5, 6], 7],求这个数组的和
解题思想:先扁平化递归再求和

    var arr = [1, 2, [3, 4], [5, 6], 7]
    function flat (arr) {
     	var res = []
     	for (var i = 0; i < arr.length; i++) {
     		if (Array.isArray(arr[i])) {
     			res = res.concat(flat(arr[i]))
     		} else {
     			res.push(arr[i])
     		}
     	}
     	return res
    }
    var count = 0
    flat(arr).forEach(element => {
    	count += element
    })
    console.log(count)

2 实现数字重复元素的查找。

题目描述:
参数输入 [0,1,1,3,2,4,3,5]
返回 [1,3]
解题思想:使用indexOf 或者sort排序然后相邻比较去重

   function f(arr){
       var res = []
       var num = []
       for(var i=0;i<arr.length;i++){
           if(res.indexOf(arr[i]) ==-1){
               res.push(arr[i])
           }else{
               num.push(arr[i])
           }
       }
       return num;
   }
   var arr = [0,1,1,3,2,4,3,5]
   console.log(f(arr))
   
或者

 var arr = [0,1,1,3,2,4,3,5]
 arr.sort()
 var res = [arr[0]] // 用来存放去重后的数组,同时将arr[0]先存进去
 console.log(res)
 var num= [] // 用来存放重复的数据
 function f (arr) {
     for (var i = 1; i < arr.length; i++) {
     	if (arr[i] == arr[i-1]) {
     	 num.push(arr[i])
     	} else {
     		res.push(arr[i])
     	}
     }
     return num
 }
 console.log(f(arr))

3 移除数组中元素

问题描述:移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回
输入: [1, 2, 2, 3, 4, 2, 2], 2
输出:[1, 3, 4]

	function removeWithoutCopy(arr, item) {
	    for(var index=0; index<arr.length; index++){
	        if(arr[index] === item){
	            arr.splice(index, 1)
	            index--
	        }
	    }
	    return arr
	}

4 点击li,输出对应的下标

// 方法一: 把下标i变成li的一个属性
   	var obj=document.getElementsByTagName('li');
   	for(var i=0;i<obj.length;i++){
   	  obj[i].id=i;
   	  obj[i].onclick=function(){
   		 console.log(++this.id);
   	  }
   	}
		   
// 方法二: 使用闭包的方法
   	var list =document.getElementsByTagName('li');  
   	for(var i=0;i<list.length;i++) {//遍历每一个li标签
   	  function outer ( ) {
   		var num=i+1;
   		function inner ( ) {
   		  alert("您点击了第"+num+"个li标签");
   		}
   		return inner;
   	  }
   	  //给每一个li标签注册单击事件
   	  list[i].onclick=outer();
   	}
   		
// 方法三:使用let定义for里面的变量
   	var tag = document.getElementsByTagName('li');
   	for(let i=0;i<tag.length;i++){
   		tag[i].onclick = function(){
   			alert(++i);
   		}
   	}

5 上一题的基础上,获取 li 里面的内容

	var lis = document.getElementsByTagName("li");//查找所有LI标签
	for(var i=0;i<lis.length; i++){
	    if(lis[i].tagName=="LI"){
	        lis[i].onclick=function(){//增加单击事件
	            //这里写你的代码
	            alert(this.innerHTML);
	        };
	    }
	}

6 找出元素 item 在给定数组 arr 中的位置

题目描述:如果数组中存在 item,则返回元素在数组中的位置,否则返回 -1
输入:[ 1, 2, 3, 4 ], 3
输出:2

	易产生误区的地方,见代码:forEach虽然找到了item===e,但是,最终的结果还是会return -1.即使找到对应的位置也没有立即返回。
	function indexOf(arr, item) {
	   arr.forEach((e, index) => {
	       if(e === item){
	           return index
	       }
	   })
	   return -1
	}

解决办法:提前赋值一个num用作返回,只有再找到才修改这个值
	function indexOf(arr, item) {
	    var num = -1
	    arr.forEach((e, index) => {
	        if(e === item){
	            num = index
	        }
	    })
	    return num
	}

7 查找重复元素

题目描述: 找出数组 arr 中重复出现过的元素
输入:[1, 2, 4, 4, 3, 3, 1, 5, 3]
输出:[1, 3, 4]
解题思路:先排序,然后拿到当前元素 ( = 前 && != 后 )则push到结果中

	function duplicates(arr) {
	    arr.sort()
	    var res = []
	    for(var i=1; i<arr.length-1; i++){
	        if(arr[i]==arr[i-1] && arr[i]!=arr[i+1]){
	            res.push(arr[i])
	        }
	    }
	    return res
	}

8 检查重复字符串

题目描述:给定字符串 str,检查其是否包含连续重复的字母(a-zA-Z),包含返回 true,否则返回 false
输入:‘rattler’
输出:true
解题思路:将输入的字符串分割成数组,然后循环每个元素,只有再当前元素是字母的情况下,才接着判断是否重复

function containsRepeatingLetter(str) {
    var arr = str.split('')
    var reg= /^[A-Za-z]+$/;
    for(var i = 1; i < arr.length; i++){
        // 判断当前元素是否是字母
        if (reg.test(arr[i]))
        {
            // 判断是否有重复
            if(arr[i]==arr[i-1]){
                return true
            } 
        } 
    }
    return false
}

9 计时器

题目描述
实现一个打点计时器,要求:
1、从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
2、返回的对象中需要包含一个 cancel 方法,用于停止定时操作
3、第一个数需要立即输出

function count(start, end) {
    console.log(start)
    var timer = setInterval(function () {
        if (start < end) {
            console.log(++start)
        }
    }, 100)
    return { cancel: function () { clearInterval(timer)} }
}

10 关于多维数组排序问题

let color = ['blue','red','white'];
let size = ['s','m','l'];
let style = [1,2,3];
let result = [];
for (var i = 0; i < color.length; i++) {
    for (var j = 0; j < size.length; j++) {
        for (var k = 0; k < style.length; k++) {
            result.push({
                color: color[i],
                size: size[j],
                style: style[k]
            })
        }        
    }    
}
console.log(result);

11 求出现最多次字母的前系数和

题目描述:[‘1c’, ‘3b’, ‘1c’, ‘2a’, ‘7b’, ‘2c’]这样一个由数字和字母构成的数组,求出现最多次字母的前系数和,
例如:a出现了三次,最多,输出1+2+2=5

var arr = ['1a', '3b', '1c', '2a', '7b', '2a']
var max = 0 // 存储出现的最大次数
var k = '' // 存储出现最多的那个key
var all = {} // 存储不同key的value的和
var count = {} // 存储每个key出现的次数
for (let i = 0; i < arr.length; i++) {
  let key = arr[i].split('')[1];
  let value = parseInt(arr[i].split('')[0])
  if (key in all) {
    // 如果已经存在相同的key,则将value累加
    all[key] = all[key] + value
    count[key]++ // 将该key出现次数加一
  } else {
    // 如果没有出现,则将key加进去,并且设置出现次数为1
    all[key] = value
    count[key] = 1
  }
  // 如果超过最大次数,则将最大次数重新赋值,最大次数的key也重新赋值方便取出
  if (max < count[key]) {
    max = count[key]
    k = key
  }
}
console.log(all[k])

12 对象(如{key: value})按value的大小降序输出key值

题目描述:
输入:{bill:500, sam:480, roark:501}
输出:[ ‘roark’, ‘bill’, ‘sam’ ]

function sortting(obj) {
	let resultAry = []
	for (let i in obj) {
		var temp = {}
		temp[i] = obj[i]
		temp.value = obj[i]
		resultAry.push(temp)
	}
	resultAry.sort((a,b)=> b.value-a.value)
	console.log(resultAry)
	let result = []
	for (let i = 0; i<resultAry.length; i++) {
		delete resultAry[i].value
		result = result.concat(Object.keys(resultAry[i]))
	}
	console.log(result)
}
let test = {bill:500, sam:480, roark:501}
sortting(test)

13 无重复最长字串

题目描述:给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:

  • 给定 “abcabcbb” ,没有重复字符的最长子串是"abc",那么长度就是3。
  • 给定 “bbbbb” ,最长的子串就是"b",长度是1。
  • 给定 “pwwkew”,最长子串是"wke",长度是3。请注意答案必须是一个子串,"pwke"是子序列 而不是子串。

思路分析:
对字符串进行遍历,使用String.prototype.indexOf()实时获取遍历过程中的无重复子串并存放于str,并保存当前状态最长无重复子串的长度为res,当遍历结束时,res的值即为无重复字符的最长子串的长度。

var longString = function(s) {
	var res = 0 // 用于存放当前最长无重复子串的长度
	var str = "" // 用于存放无重复子串
	for(var i = 0; i < s.length; i++) {
		// charAt() 方法可返回指定位置的字符。
		var char = s.charAt(i)
		/* indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
		如果要检索的字符串值没有出现,则该方法返回 -1。 */
		var index = str.indexOf(char)
		if(index === -1) {
			str += char;
			res = res < str.length ? str.length : res
		} else {
		// substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。
			str = str.substr(index + 1) + char
		}
	}
	return str 
}
console.log(longString('pwwkew'))

14. 括号匹配

// a:遍历输入测试的字符串,模板括号字符加入数组(用于最后进行比较判断);
// b:遍历字符串数组,先进行判断长度为空,在进行判断是否为奇偶数,如果是偶数,就进行下一步,
// 	比较算法为:遍历字符串数组,如果是右括号,就让它和前面一位的字符进行匹配,匹配成功就移除掉两个元素,
// 	然后从头遍历。匹配不成功就接着往下循环。如果到最后数组的元素长度为空,那么完全匹配,
// 	如果还有元素,就说明匹配不成功
var moduleJson = {//括号匹配模板,你可以增加别的匹配,比如“{}”,“<>”,等,只需写入moduleJson里面去  
   ")":"(",  
   "]":"["  
}  
var testStr = "([()]())()()";//测试字符串  
var tempSaveArray = [];//用于存储字符串的数组
for(var i = 0;i<testStr.length;i++){//如果存在括号字符,就加入数组  
   for(var key in moduleJson){  
       if(testStr[i] == key||testStr[i]==moduleJson[key]){//如果字符串中存在json中的key 和value字符,就加入数组  
           tempSaveArray.push(testStr[i]);  
       }  
   }  
}
if(tempSaveArray.length){  
   if((tempSaveArray.length%2)!=0){//如果括号的长度为奇数,肯定不匹配  
       console.log("括号不匹配");
   }else{//如果字符串括号长度为偶数,就进行遍历数组,进行判断 12345  0 4  
       for(var j = 0;j<tempSaveArray.length;j++){
           //(((())))
           if(moduleJson[tempSaveArray[j]]){//如果是右括号,就和前一个进行匹配。
               //拿到数组前一位的字符,是否与自己匹配
               if(j>0){
                   // console.log("前一个元素:"+j+tempSaveArray[j-1]+" 后一个元素"+moduleJson[tempSaveArray[j]]); 
                   console.log(moduleJson[tempSaveArray[j]]==tempSaveArray[j-1]);
                   if(moduleJson[tempSaveArray[j]]==tempSaveArray[j-1]){//说明两个括号进行了匹配,让其出栈
                           tempSaveArray.splice(j-1,2);
                           j=0;//从新遍历数组
                   }
               }  
           }
       } 
       if(tempSaveArray.length){//没有移除完毕
           console.log("括号不匹配");
       } else{
           console.log("括号匹配,恭喜你语法正确!"); 
       }
   }  
}else{  
   console.log("你输入的字符串不存在括号");  
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值