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;
}
50道JavaScript经典题和解法(JS新手进...持续更新...)的更多相关文章
- SAM 做题笔记(各种技巧,持续更新,SA)
SAM 感性瞎扯. 这里是 SAM 做题笔记. 本来是在一篇随笔里面,然后 Latex 太多加载不过来就分成了两篇. 标 * 的是推荐一做的题目. trick 是我总结的技巧. I. P3804 [模 ...
- 汤姆大叔的6道javascript编程题题解
看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试. 1.找出数字数组中最大的元素(使用Math.max函数) var a = [1, 2, 3, 6, 5, 4 ...
- 50道JavaScript基础面试题(附答案)
https://segmentfault.com/a/1190000015288700 1 介绍JavaScript的基本数据类型 Number.String .Boolean .Null.Undef ...
- (转)50道JavaScript基础面试题(附答案)
https://segmentfault.com/a/1190000015288700 1 介绍JavaScript的基本数据类型 Number.String .Boolean .Null.Undef ...
- 20道JavaScript经典面试题
该篇文章整理了一些前端经典面试题,附带详解,涉及到JavaScript多方面知识点,满满都是干货-建议收藏阅读 前言 如果这篇文章有帮助到你,️关注+点赞️鼓励一下作者,文章公众号首发,关注 前端南玖 ...
- SQL Server 50道查询训练题,学生Student表
下面这个是题目所用到的数据库! 首先你需要在你的SQL Sever数据库中创建[TestDb]这个数据库,接下来下面这个代码.直接复制在数据库里运行就好了! 1 USE [TestDb] 2 GO 3 ...
- 50道 Sql语句题
Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 ...
- 50道java算法题(一)
[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1 ...
- 107个JS常用方法(持续更新中)
1.输出语句:document.write(""); 2.JS中的注释为//3.传统的HTML文档顺序是:document->html->(head,body)4.一个 ...
随机推荐
- HDU3657 Game(最小割)
题目大概说,给一个n×m的格子,每个格子都有数字,选择一个格子就能加上格子数字的分数,有k个格子必须选择,如果两个相邻的格子都被选择了那分数要减去两个格子数字的与再乘2.问能取得的最大分数. 已经知道 ...
- POJ1155 TELE(树形DP)
题目是说给一棵树,叶子结点有负权,边有正权,问最多能选多少个叶子结点,使从叶子到根的权值和小于等于0. 考虑数据规模表示出状态:dp[u][k]表示在u结点为根的子树中选择k个叶子结点的最小权值 最后 ...
- HDU2296 Ring(AC自动机+DP)
题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...
- Machine Schedule
Machine Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- SSH整合JBPM4.4
第一步:导入所需jar包: 所需的jar包(使用了hibernate annotation和struts2的convention-plugin,可能有多余的包,没做清理): 第二步:修改jbpm配置文 ...
- javascript 三个 对话框
用法: 一般写在 </html>之后,<script language="javascript">代码必须放在这里面</script> 三个常用 ...
- for循环计算游戏通关分数
一个游戏1到20关是成绩是自身关卡数的成绩,21-30每关10分,31-40每关20分,41-49每关30分,50关100分.输入一个关数求成绩 代码如下: <!DOCTYPE html PUB ...
- ThinkPHP框架的部署
1.将ThinkPHP框架的框架文件放到想要放置的地方,与创建的应用文件夹同级 2.vhost文件中设置虚拟目录 3.在hosts文件中配置 4.在应用目录中创建入口文件index.php 5.在入口 ...
- 用MSoffice里的绘图工具
试过一些绘图表的工具,在xbeta推荐的替代visio一文中介绍的一些软件.之前用得最多的就是Dia,在linux下也有.现在才发现在微软的office下的绘图工具已经足够我使用了,不需要专业的图形符 ...
- Memcached 笔记与总结(3)安装 php-memcache(windows 系统下)
在 windows 下安装 php-memcache,需要下载编译好的 memcached.dll. 要找到可用的 dll 文件,需要根据 php.ini 中的 3 个参数来选择 dll 文件: ① ...