前端面试整理——javascript算法和测试题
(1)算法:
1、斐波那契数列:1、1、2、3、5、8、13、21。输入n,输出数列中第n位数的值。
方案一:
function fn(n){
var num1 = 1, num2= 1, num3 = 0;
for(var i=0;i<n-2;i++){
num3 = num1+num2;
num1 = num2;
num2 = num3;
}
return num3;
}
console.log(fn(7)) //13
方案二:
function fn(n){
if(n<=2){
return 1;
}
return fn(n-1)+fn(n-2);
}
console.log(fn(7)) //13
2、数组排序
1)冒泡排序
实现:
a、双重for循环 b、指定比较的轮数和每轮比较的次数 c、如果符合条件就交换位置
流程:
a、比较相邻的元素,如果第一个比第二个大,就交换他们两个的位置。从开始第一对比较到最后一对,最后的元素是最大的元素。
b、从头到尾再比较一次,每进行一轮最后的都是最大的了,因此后一轮比前一轮少一次比较。
function maopao(arr){
var temp=0;
for(var i=0;i<arr.length-1;i++){
for(var j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
var s=[15,32,12,5,7,6];
var result=maopao(s);
console.log(result);
2)插入排序
//双重for循环实现
function insertSort(arr){
var temp = 0;
for(var i=1;i<arr.length;i++){
var temp = arr[i];
for(var j=i-1;j>=0;j--){
if(arr[j]>temp){
arr[j+1]=arr[j];
}else{
break;
}
}
arr[j+1]=temp;
}
return arr;
}
//for+while实现
function insertSort2(arr){
var temp = 0;
for(var i=1;i<arr.length;i++){
var temp = arr[i];
var j = i-1;
while(j>=0 && arr[j]>temp){
arr[j+1]=arr[j];
j--;
}
arr[j+1]=temp;
}
return arr;
}
var arr = [32,6,12,9,23,5,8,1,23];
var arr2 = [32,6,12,9,23,5,8,1,23];
console.log('for:'+insertSort(arr));
console.log('while:'+insertSort2(arr2));
3)简单选择排序
3、用js实现二分查找
二分查找的前提是有序数组
实现:将要查找的值每次与中间值比较,大于中间值,则在右边进行相同的查找,小于中间值则在左边进行比较查找,找到返回索引值,没找到返回-1。
1、非递归查找
function binarySearch(target,arr){
var start = 0;
var end = arr.length-1;
while(start <= end){
var mid = parseInt((start+end)/2);
if(target == arr[mid]){
return mid
}else if(target > arr[mid]){
start = mid + 1;
}else if(target < arr[mid]){
end = mid - 1;
}else{
return -1;
}
}
}
var arr = [1,2,4,6,8,9,11,34,67];
console.log(binarySearch(11,arr));
2、递归查找
function binarySearch(arr,target,start,end){
var start = start || 0;
var end = end || arr.length-1;
var mid = parseInt((start+end)/2);
if(target == arr[mid]){
return mid
}else if(target > arr[mid]){
start = mid + 1;
return binarySearch(arr,target,start,end);
}else if(target < arr[mid]){
end = mid - 1;
return binarySearch(arr,target,start,end);
}else{
return -1;
}
}
var arr = [1,2,4,6,8,9,11,34,67];
console.log(binarySearch(arr,11));
4、数组去重
方案一:
function fn(arr){
var obj = {};
var newArr = [];
for(var i=0;i<arr.length;i++){
if(!obj[arr[i]]){
obj[arr[i]] = 1;
newArr.push(arr[i]);
}
}
return newArr;
}
var arr = [2,4,7,3,5,2,8,7];
console.log(fn(arr));
方案二:
var arr = [2,4,7,3,5,2,8,7];
var setArr = new Set(arr);
var newArr = Array.from(setArr);
console.log(newArr);
方案三:
var arr =[1,2,2,4,5,4,11,6];
function fn(arr){
var a=arr;
for(var i=0;i<a.length;i++){
for(var j=a.length-1;j>i;j--){
if(a[i]==a[j]){
a.splice(j,1);
}
}
}
return a;
}
var s=fn(arr);
console.log(s);
5、数组求和
var arr = [10,23,45,70,10];
var num1 =0;
//方案一
arr.forEach((item)=>{
num1 += item;
})
console.log(num1);
//方案二
var num2 =0;
arr.some((item)=>{
num2 += item;
})
console.log(num2);
//方案三
var num3 =0;
arr.filter((item)=>{
num3 += item;
})
console.log(num3);
//方案四
var num4 =0;
arr.map((item)=>{
num4 += item;
})
console.log(num4);
//方案五
var num5 =0;
num5 = arr.reduce((num,now)=>{
return num+now;
})
console.log(num5);
(2)测试题:
1、哪个会弹出1?
A. if('21'<'15'){alert(1)}
B. if(15-15){alert(1)}
C. if('21'<15){alert(1)}
D. if('5'+0){alert(1)}
选D,解析:
1)'21'<'15' 字符串之间的比较,是按照从左到右的顺序,逐位进行比较,按照unicode码的大小
charCodeAt(index)用于获取指定索引值位置的unicode
2)'5'+0 =》 '50' => true
+作用: 字符串拼接:左右两侧只要有一侧是字符串,那么就是字符串拼接
2、输出结果?
var i=0,j=0;
for(;j<6,i<10;i++,j++){
k = i+j;
}
console.log(k);//18
解析:
逗号运算符,返回最后一位
3、(!+[]+[]+!+[]).length 输出结果?
console.log((!+[]+[]+!+[]).length); //8
解析:
(!+[]+[]+!+[]) //truetrue
首先是这里的第一个加号代表的是正号
!+[] 结果为布尔值true
!+[]+[]结果为字符串true
4、2000['toString']['length'] 输出结果?
console.log(2000['toString']['length']); //1
解析:
2000['toString']返回一个函数,function.length这里返回函数的参数个数。
5、输出结果是多少?
var f = function g(){return 23;};
console.log(typeof g()); // g is not defined
解析:
外部访问不到g()函数
6、写一个字符串转成驼峰的方法
方法一:
function change(str){
var s1 = str.split("");
for(var i=0;i<s1.length;i++){
if(s1[i] == '-'){
s1[i+1] = s1[i+1].toUpperCase();
}
}
return s1.join("").replace(/-/g,'');
}
var str = "border-bottom-color";
console.log(change(str));
方法二:
function change(str){
var s1 = str.split("-");
for(var i=1;i<s1.length;i++){
s1[i] = s1[i].charAt(0).toUpperCase() + s1[i].substring(1);
}
return s1.join("");
}
var str = "border-bottom-color";
console.log(change(str));
方法三:
function change(str){
var reg = /-(\w)/g;
return str.replace(reg,function(s1,s2){
return s2.toUpperCase();
})
}
var str = "border-bottom-color";
console.log(change(str));
7、查找字符串中出现最多的字符和个数
方法一:
function query(str){
var obj = {};
var s1 = str.split("");
for(var i=0;i<s1.length;i++ ){
if(!obj[s1[i]]){
obj[s1[i]] = 1;
}else{
obj[s1[i]]++;
}
}
var maxChar = '';
var maxNum = 0;
for(var key in obj){
if(obj[key]>maxNum){
maxNum = obj[key];
maxChar = key;
}
}
console.log(maxChar,maxNum);
}
var str = "sdfejdmdjskijfdheeehehehsss";
query(str);
方法二:
function query(str){
var obj = {};
var num = 0;
var value = 0;
for(var i=0;i<str.length;i++){
if(!obj[str[i]]){
obj[str[i]] = [];
}
obj[str[i]].push(str[i]);
}
for(var attr in obj){
if(num < obj[attr].length){
num = obj[attr].length;
value = obj[attr][0];
}
}
console.log(value,num);
}
var str = "sdfejdmdjskijfdheeehehehsss";
query(str);
方法三:
function query(str){
var arr = str.split("");
arr.sort();
str = arr.join("");
var num = 0;
var value = '';
var re = /(\w)\1+/g;
str.replace(re,function(param1,param2){
if(num<param1.length){
num = param1.length;
value = param2;
}
});
console.log(value,num);
}
var str = "sdfejdmdjskijfdheeehehehsss";
query(str);
8、如何给字符串加千分符?
方案一:
function fn(str){
var arr = [];
var num = str.length%3;
if(num){
arr.push(str.slice(0,num));
str = str.substring(num);
}
var count = 0;
var temp = '';
for(var i=0;i<str.length;i++){
count++;
temp += str[i];
if(count ==3 && temp){
arr.push(temp);
temp = '';
count = 0;
}
}
var newStr = arr.join(',');
console.log(newStr);
}
var str = '3323245678651456';
fn(str);
方案二:
function fn(str){
var arr = [];
var num = str.length%3;
if(num){
arr.push(str.slice(0,num));
}
var count = 3;
for(var i = num;i<str.length;i++){
count --;
if(count == 2){
arr.push(str.slice(i,i+3));
}else if(count == 0){
count = 3;
}
}
var newStr = arr.join(',');
console.log(newStr);
}
var str = '3323245678651456';
fn(str);
方案三:
function fn(str){
// ?1\b代表不属于独立部分,开始、结束、有空格
var re = /(?=(?!\b)(\d{3})+$)/g;
console.log(str.replace(re,','));
}
var str = '3323245678651456';
fn(str);
9、返回一个值包含数字类型的数组?
方案一:
function fn(str){
var arr = [];
var temp = '';
for(var i=0;i<str.length;i++){
if(!isNaN(str[i])){
temp += str[i];
}
if(isNaN(str[i]) || (i== str.length-1 && !isNaN(str[i]))){
if(temp){
arr.push(temp);
temp = '';
}
}
}
console.log(arr);
}
var str = 'js123ldka78sdassdfd653ssss3';
fn(str);
方案二:
function fn(str){
var re = /[0-9]+/g;
var arr = [];
str.replace(re,function($0,$1){
arr.push($0);
});
console.log(arr);
}
var str = 'js123ldka78sdassdfd653ssss3';
fn(str);
10、a,b两个变量,不用第三个变量来切换两个变量的值
方案一:
var a = 10,var b = 20;
[a,b] = [b,a];
console.log(a,b);
方案二:
var a = 10,b = 20;
a = [b,b=a][0];
console.log(a,b);
解析:
b=a 是赋值表达式、可以像普通的表达式一样用于任何表达式中,也包括在数组中使用。
a=[b,b=a][0]的执行顺序是:
第一步把b的值放入数组的0下标中;
第二步执行b=a赋值表达式,对b重新赋值,并把这个值放入数组的1下标,这个数组的1下标是没有用的,b=a写这里是为了让它在第三步之前执行。
第三步把数组的0下标赋值给a。
11、有一个数n=5,不用for循环,怎么返回[1,2,3,4,5]这样的数组?
function fn(n){
var arr = [];
return (function(){
arr.unshift(n);
n--;
if(n!=0){
arguments.callee(n);
}
return arr;
})();
}
console.log(fn(5));
12、一个数n,当n小于100时返回n,否则就返回100
方案一:
function fn(n){
return n<100?n:100;
}
console.log(fn(102));
方案二:
function fn(n){
return Math.min(n,100);
}
console.log(fn(99));
方案三:
function fn(n){
switch(n<100){
case true:
return n;
break;
case false:
return 100;
break;
}
}
console.log(fn(99));
方案四:
var n = 104;
var arr = [n,100];
arr.sort(function(n1,n2){
return n1-n2;
})
console.log(arr[0]);
13、伪数组及转化标准数组
方案一:for循环
var arr = [];
for(var i=0;i<funs.length;i++){
arr.push(funs[i]);
}
console.log(arr);
方案二:
var arr = Array.prototype.slice.call(funs);
//或
var arr = [].slice.call(funs);
14、以下题目弹出的结果是多少?
var i=0;
alert(++i == i++); //true
解析:
等式是从左往右执行,先是执行了++i ,然后进行比较,最后执行i++
15、以下输出结果是多少?
function Fn(){
this.name = 'miaov';
this.adress = '北京';
return {}
}
var fn = new Fn();
console.log(fn.name); //undefined
前端面试整理——javascript算法和测试题的更多相关文章
- 前端面试之JavaScript的基本数据类型!
前端面试之JavaScript的基本数据类型! JS的基本数据类型 数字 字符串 布尔值 JavaScript中有两个特殊的原始值: null (空) 和undefined (未定义), , 它们不是 ...
- 前端面试之JavaScript中数组的方法!【残缺版!!】
前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...
- 前端面试之JavaScript中的闭包!
前端面试之JavaScript中的闭包! 闭包 闭包( closure )指有权访问另一个函数作用域中变量的函数. ----- JavaScript 高级程序设计 闭包其实可以理解为是一个函数 简单理 ...
- 前端面试回顾---javascript的面向对象
转:https://segmentfault.com/a/1190000011061136 前言 前一阵面试,过程中发现问到一些很基础的问题时候,自己并不能很流畅的回答出来.或者遇到一些基础知识的应用 ...
- 前端面试整理(HTML&CSS)
1.行内元素和块级元素?img算什么?行内元素怎么转化为块级元素? 行内元素:和有他元素都在一行上,高度.行高及外边距和内边距都不可改变,文字图片的宽度不可改变,只能容纳文本或者其他行内元素:其中im ...
- 前端面试之Javascript
1,JS基本的数据类型和引用类型: (1)基本数据类型:number,string,null,undefined,symbol--栈: (2)引用数据类型:object,array,function- ...
- 前端面试之JavaScript中this的指向【待完善!】
JavaScript中this的指向问题! 另一个特殊的对象是 this,它在标准函数和箭头函数中有不同的行为. 在标准函数中, this 引用的是把函数当成方法调用的上下文对象,这时候通常称其为 t ...
- web前端面试第一次[javascript函数和方法的区别]
//函数 function f1(){ console.log("我是函数"); } //调用函数 f1(); //创建一个空对象 var obj = {} //把函数定义到对象里 ...
- web前端面试知识点整理
一.HTML5新特性 本地存储 webStorage websocket webworkers新增地理位置等API对css3的支持canvas多媒体标签新增表单元素类型结构标签:header nav ...
随机推荐
- 下单快发货慢:一个 JOIN SQL 引起 SqlClient 读取数据慢的奇特问题
最近遇到一个非常奇特的问题,在一个 ASP.NET Core 项目中从 SQL Server 2008 R2 中查询获取 100 条记录竟然耗时 10 多秒,如果是查询本身慢,那到不是什么奇特的问题. ...
- 背水一战 Windows 10 (91) - 文件系统: Application Data 中的文件操作, Application Data 中的“设置”操作, 通过 uri 引用 Application Data 中的媒体
[源码下载] 背水一战 Windows 10 (91) - 文件系统: Application Data 中的文件操作, Application Data 中的“设置”操作, 通过 uri 引用 Ap ...
- 通过Function Score Query优化Elasticsearch搜索结果(综合排序)
在使用 Elasticsearch 进行全文搜索时,搜索结果默认会以文档的相关度进行排序,如果想要改变默认的排序规则,也可以通过sort指定一个或多个排序字段. 但是使用sort排序过于绝对,它会直接 ...
- python中使用双端队列解决回文问题
双端队列:英文名字:deque (全名double-ended queue)是一种具有队列和栈性质的抽象数据类型. 双端队列中的元素可以从两端弹出,插入和删除操作限定在队列的两边进行. 双端队列可以在 ...
- Data - 关于大数据
历史与趋势 大数据的前世今生:诞生.发展.未来? 如何利用数据赚钱?大数据价值变现的10种商业模式及利弊分析 10大行业大数据应用痛点及解决策略 大数据凉了?不,流式计算浪潮才刚刚开始 概念与定义 关 ...
- LeetCode--No.002 Add Two Numbers
Add Two Numbers Total Accepted: 160702 Total Submissions: 664770 Difficulty: Medium You are given tw ...
- 记一次sentry部署过程
本文记录下部署sentry和其中遇到的问题 Sentry 是一款基于 Django实现的错误日志收集和聚合的平台,它是 Python 实现的,但是其日志监控功能却不局限于python,对诸如 Node ...
- 高效的 JavaScript
避免使用 eval 或 Function 构造器 改写 eval 如果你需要函数,使用 function 不要使用 with 不要在要求性能的函数中使用 try-catch-finally 隔离 ev ...
- Linux Shell常用shell命令
Linux Shell常用shell命令 一.文件.目录操作命令 1.ls命令 功能:显示文件和目录的信息 ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示 ...
- 原创python:windows解决genymotion appium adb 的问题。
首先请安装好genymotion 与并用其下载好要用的安卓版本. (其中Oracle VM VirtualBox可以自己单独安装也可以在下载genymotion时选择包含vbox的) 参考https: ...