• 50道JavaScript经典题和解法(JS新手进...持续更新...)


    最近在学习《数据结构与算法JavaScript描述》这本书,对JavaScript的特性和数据结构都有了进一步的了解和体会。

    学习之余,也进行了相应的练习,题目难度不大,但是对所学知识的巩固十分有帮助,所以在这里和大家做一个分享。

    注:题目主要来源于牛客网,这是一个不错的网站,对于代码的学习和自我能力的检验很有帮助,有兴趣的朋友可以去看看。

    这些题目解法绝大多数是根据自己的思路做的,并且几乎都采用了多种方法,某些方法参考了网站中其他朋友的代码,如果

    有更好的解法也欢迎大家提出来,我会进行详细的补充。如果有明显的错误也求大家轻喷。

    首先是数组的部分,关于JavaScript中数组的操作在上一篇的博客"Javascipt操作数组"中做过比较详细的介绍,如果对下

    面的题目解法中的方法有所疑问的朋友可以去看看。

    Talk is cheap,show me the code!  

    【数组】

    一、移除数组 arr 中的所有值与 item 相等的元素。不要直接修改数组 arr,结果返回新的数组。

    // 方法一  使用过滤器方法
    function remove(arr, item) {
    	return arr.filter(function(x){
    		return (x!=item);
    	})
    }
    // 方法二  创建新数组,将删除指定元素后剩下的元素存入此数组并返回
    function remove(arr,item){
    	var newArr = [];
    	//var index = 0;
    	for(var i in arr){
    		if(arr[i] != item){
    			newArr.push(arr[i]);
    			//newArr[index++] = arr[i];
    		}
    	}
    	return newArr;
    }
    // 方法三	   浅复制原数组,并对新数组使用splice()方法删除指定元素
    function remove(arr, item) {
    	var newArr = arr;
    	for (var i = 0; i < newArr.length; i += 1) {
    		if (newArr[i] === item) {
    			newArr.splice(i, 1);
    		}
    	}
    	return newArr;
    }

    二、移除数组 arr 中的所有值与 item 相等的元素,请直接在给定的 arr 数组上进行操作 

    function removeWithoutCopy(arr,item){
    	for(var i=0;i<arr.length;i++){
    		if(arr[i]===item){
    			arr.splice(i,1);
    			i--; 	//因为每次删除一个元素,数组长度减一,所以需要将 i 减一
    		}
    	}
    	return arr;
    }

    三、在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组

    // 方法一 concat() 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
    function append(arr,item){
    	return arr.concat(item);
    }
    
    // 方法二	 slice(0)复制数组
    function append(arr, item) {
        var newArr = arr.slice(0);		//复制数组
        newArr.push(item);				//添加元素
        return a;
    }
    
    // 方法三 给数组添加元素
    function append(arr,item){
    	var newArr = new Array();
    	for(var i=0;i<arr.length;i++){
    		newArr[i] = arr[i];
    	}
    	newArr[newArr.length] = item;
    	return newArr;
    }

    四、删除数组 arr 最后一个元素。不要直接修改数组 arr,结果返回新的数组

    / 方法一 直接将原数组的1到length-1的元素赋值给新数组并返回
    function truncate(arr) {
    	var newArr = [];
    	for(var i=0;i<arr.length-1;i++)
    	{
    		newArr[i] = arr[i];
    	}
    	return newArr;
    }
    
    // 方法二	 slice(start,end)  从数组中返回选定的元素
    function truncate(arr){
    	return arr.slice(0,arr.length-1);
    }
    
    // 方法三 push()
    function truncate(arr){
    	var newArr = [];
    	for(var i in arr){
    		if(i != arr.length-1){
    			newArr.push(arr[i]);
    		}
    	}
    	return newArr;
    }

    五、在数组 arr 开头添加元素 item。不要直接修改数组 arr,结果返回新的数组

    // 方法一 新建数组并为第一个元素赋值为item
    function prepend(arr, item) {
    	var newArr = [];
    	newArr[0] = item;
    	for(var i=0;i<arr.length;i++){
    		newArr[i+1] = arr[i];
    	}
    	return newArr;
    }
    
    // 方法二 类似方法一,但是直接用concat连接newArr和arr
    function prepend(arr,item){
    	var newArr = [];
    	newArr[0] = item;		//newArr.push(item);
    	newArr.concat(arr);
    	return newArr;
    }
    
    // 方法三 unshift()方法
    function preaend(arr,item){
    	var newArr = arr.slice(0);
    	return newArr.unshift(item);
    }

    六、删除数组 arr 第一个元素。不要直接修改数组 arr,结果返回新的数组

    //方法一:直接将原数组的第1~(length-1)的元素赋值给新的数组并返回
    function delHead(arr){
    	var newArr = [];
    	for(var i=0;i<arr.length-1;i++){
    		newArr[i] = arr[i+1];
    	}
    	return newArr;
    }
    
    // 方法二 shift()方法
    function delHead(arr){
    	var newArr = arr.slice(0);
    	newArr.shift();
    	return newArr;
    }
    
    // 方法三	  直接截取arr的第二到最后的元素到新数组
    function delHead(arr){
    	var newArr = arr.slice(1);
    	return newArr;
    }

    七、合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组

    // 方法一:使用concat()方法
    function concat(arr1,arr2){
    	var arr = arr1.concat(arr2);
    	return arr;
    }
    
    //方法二: 将arr2中的元素全部插入到arr1中
    function concat(arr1,arr2){
    	var newArr = new Array();
    	for(var j=0;j<arr1.length;j++){
    		newArr[j] = arr1[j];
    	}
    	for(var i=0;i<arr2.length;i++){
    		arr[j+i] = arr2.[i];
    	}
    	return arr;
    }
    
    // 方法三:分别将arr1和arr2的内容加到新数组中
    function concat(arr1,arr2){
    	var newArr = [];
    	for(var i in arr1){
    		newArr.push(arr1[i]);
    	}
    	fmr(var j in arr2){
    		newArr.push(arr2[j])
    	}
    	return newArr;
    }

    八、在数组 arr 的 index 处添加元素 item。不要直接修改数组 arr,结果返回新的数组

    // 方法一:使用splice(index,n,item)方法
    function insert(arr, item, index) {
    	var newArr = arr.slice(0);
    	newArr.splice(index,0,item);
    	return newArr;
    }
    
    // 方法二:将原数组在index处拆分并添加item赋值给新数组
    function insert(arr,item,index){
    	var newArr = new Array();
    	newArr = arr.slice(0,index).concat(item).concat(arr.slice(index,arr.length));
    	// newArr = arr.slice(0,index).push(item).concat(arr.slice(index,arr.length));
    	return newArr;
    }
    
    // 方法三:类似方法二,对新数组进行多次赋值
    function insert(arr,item,index){
    	var newArr = [];
    	for(var i=0;i<index;i++){
    		newArr[i] = arr[i];
    	}
    	newArr[index] = item;
    	for(var j=index;j<arr.length;j++){
    		newArr[j+1] = arr[j];
    	}
    }

    九、统计数组 arr 中值等于 item 的元素出现的次数

    // 方法一:对数组中的元素进行逐个判断,若值等于item,则计数加1
    function count(arr,item){
    	var num = 0;
    	for(var i=0;i<arr.length;i++){
    		if(arr[i]===item){
    			num++;
    		}
    	}
    	return num;
    }
    
    // 方法二:类似方法一,使用forEach()
    function count(arr,item){
    	var num = 0;
    	arr.forEach(function(elem){
    		if(elem===item){
    			num++;
    		}
    	})
    	return num;
    }
    
    // 方法三:使用splice()方法进行元素的逐个判断(稍繁琐)
    function count(arr,item){
    	var num = 0;
    	while(arr.indexOf(item)!==-1){   //即找到值等于item的元素
    		arr.splice(arr.indexOf(item),1);//找到则删除该元素,继续判断剩余元素
    		num++;
    	}
    }

    十、找出数组 arr 中重复出现过的元素

    // 方法一:若最早和最晚出现某元素的index进行比较,若不相等则重复,若新数组中未存储此元素则存储
    function duplicates(arr) {
     var result = [];
        arr.forEach(function(elem){
           if(arr.indexOf(elem) !=arr.lastIndexOf(elem) && result.indexOf(elem) == -1){
               result.push(elem);
           }
        });
        return result;
    }
    // 方法二:首先判断数组中值等于x的index是否唯一,若唯一若新数组中未出现则存入新数组
    function duplicates(arr){
    	var newArr = [];
    	for(var i=0;i<arr.length;i++){
    		if(arr.indexOf(arr[i])!==i){	//数组中值为某值的元素不唯一
    			if(newArr.indexOf(arr[i])===-1){//若新数组中未存储此元素
    				newArr.push(arr[i]);
    			}
    		}
    	}
    	return newArr;
    }

     十一、为数组 arr 中的每个元素求二次方。不要直接修改数组 arr,结果返回新的数组

    // 方法一:对数组中的元素逐个平方
    function square(arr){
    	var newArr = arr.slice(0);
    	for(var i=0;i<newArr.length;i++){
    		newArr[i] = newArr[i] * newArr[i];
    	}
    	return newArr;
    }
    
    // 方法二:类似方法一,代码更为简洁
    function square(arr) {
    	var newArr = arr.slice(0);
    	for(var i in newArr){
    		newArr[i]*=newArr[i];
    	}
    	return newArr;
    }

     十二、在数组 arr 中,查找值与 item 相等的元素出现的位置

    // 方法一:找到和item值相等的元素并返回index
    function findAllOccurrences(arr, target) {
    	var index = [];
    	for(var i in arr){
    		if(arr[i]===target){
    			index.push(i);
    		}
    	}
    	return index;
    }
    
    // 方法二:满足indexOf(target)!=-1的元素输出index
    function findAllOcurrences(arr, target){
    	var index = [];
    	var i = arr.indexOf(targte);	//i为第一个满足要求的元素位置
    	while(i!==-1){
    		index.push(i);
    		i = arr.indexOf(target,i+1);
    	}
    	return index;
    }
    
  • 相关阅读:
    POJ 1222 高斯消元更稳
    Maven与Eclipse使用中遇到的问题解决之道
    Java并发之任务的描述和执行
    XMemcached简单使用示例
    Java的容器类小结
    Java系统属性与Preferences API的简单介绍
    你知道自己执行的是哪个jre吗?
    Log4J配置文件详解
    Java日志工具之SLF4J
    Java日志工具之Log4J
  • 原文地址:https://www.cnblogs.com/wx1993/p/4832555.html
Copyright © 2020-2023  润新知