前端的一些实用算法题

前端的一些算法很实用

1.判断一个单词是否是回文?

回文是指把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环。比如 mamam redivider .

很多人拿到这样的题目非常容易想到用for 将字符串颠倒字母顺序然后匹配就行了。其实重要的考察的就是对于reverse的实现。其实我们可以利用现成的函数,将字符串转换成数组,这个思路很重要,我们可以拥有更多的自由度去进行字符串的一些操作

function checkPalindrom(str) {  
    return str == str.split('').reverse().join(''); } 

2.给数组去重

如输入: [1,13,24,11,11,14,1,2] 
输出: [1,13,24,11,14,2]
需要去掉重复的11 和 1 这两个元素。

这道问题出现在诸多的前端面试题中,主要考察个人对Object的使用,利用key来进行筛选。

/**
* unique an array 
**/
let unique = function(arr) { let hashTable = {}; let data = []; for(let i=0,l=arr.length;i<l;i++) { if(!hashTable[arr[i]]) { hashTable[arr[i]] = true; data.push(arr[i]); } } return data } module.exports = unique;

3.统计一个字符串出现最多的字母

给出一段英文连续的字符串,找出重复出现最多的字母。


输入 : afjghdfraaaasdenas 
 
输出 : a

前面出现过去的算法需要的是统计次数的。


function findMaxDuplicateChar(str) {  
  if(str.length == 1) { return str; } let charObj = {}; for(let i=0;i<str.length;i++) { if(!charObj[str.charAt(i)]) { charObj[str.charAt(i)] = 1; }else{ charObj[str.charAt(i)] += 1; } } let maxChar = '', maxValue = 1; for(var k in charObj) { if(charObj[k] >= maxValue) { maxChar = k; maxValue = charObj[k]; } } return maxChar; } module.exports = findMaxDuplicateChar; 

4.排序算法

如果抽到算法题目的话,应该大多都是比较开放的题目,不限定算法的实现,但是一定要求掌握其中的几种,所以冒泡排序,这种较为基础并且便于理解记忆的算法一定需要熟记于心。冒泡排序算法就是依次比较大小,小的的大的进行位置上的交换。

function bubbleSort(arr) {  
    for(let i = 0,l=arr.length;i<l-1;i++) { for(let j = i+1;j<l;j++) { if(arr[i]>arr[j]) { let tem = arr[i]; arr[i] = arr[j]; arr[j] = tem; } } } return arr; } module.exports = bubbleSort;

除了冒泡排序外,其实还有很多诸如 插入排序,快速排序,希尔排序等。每一种排序算法都有各自的特点。全部掌握也不需要,但是心底一定要熟悉几种算法。 比如快速排序,其效率很高,而其基本原理如图
算法参考某个元素值,将小于它的值,放到左数组中,大于它的值的元素就放到右数组中,然后递归进行上一次左右数组的操作,返回合并的数组就是已经排好顺序的数组了。

function quickSort(arr) {
 
    if(arr.length<=1) { return arr; } let leftArr = []; let rightArr = []; let q = arr[0]; for(let i = 1,l=arr.length; i<l; i++) { if(arr[i]>q) { rightArr.push(arr[i]); }else{ leftArr.push(arr[i]); } } return [].concat(quickSort(leftArr),[q],quickSort(rightArr)); } module.exports = quickSort;

5.不借助临时变量,完成两个值的交换

输入 a = 2, b = 4 输出 a = 4, b =2

这种问题非常巧妙,需要大家跳出惯有的思维,利用 a , b进行置换。

主要是利用 + - 去进行运算,类似 a = a + ( b - a) 实际上等同于最后 的 a = b;


function swap(a , b) {  
  b = b - a;
  a = a + b;
  b = a - b;
  return [a,b]; } module.exports = swap; 

6.使用canvas绘制一个有限度的斐波那契数列的曲线?

在这里插入图片描述
生成斐波那契数组的方法

 function getFibonacci(n) {  
  var fibarr = []; var i = 0; while(i<n) { if(i<=1) { fibarr.push(i); }else{ fibarr.push(fibarr[i-1] + fibarr[i-2]) } i++; } return fibarr; }

剩余的工作就是利用canvas arc方法进行曲线绘制了

7.找出下列正数组最大的差值比如

输入 [10,5,11,7,8,9]
 
输出 6

这是通过一道题目去测试对于基本的数组的最大值的查找,很明显我们知道,最大差值肯定是一个数组中最大值与最小值的差。

 function getMaxProfit(arr) {
 
    var minPrice = arr[0]; var maxProfit = 0; for (var i = 0; i < arr.length; i++) { var currentPrice = arr[i]; minPrice = Math.min(minPrice, currentPrice); var potentialProfit = currentPrice - minPrice; maxProfit = Math.max(maxProfit, potentialProfit); } return maxProfit; } 

8. 随机生成指定长度的字符串

实现一个算法,随机生成指制定长度的字符窜。

比如给定 长度 8  输出 4ldkfg9j

function randomString(n) {  
  let str = 'abcdefghijklmnopqrstuvwxyz9876543210'; let tmp = '', i = 0, l = str.length; for (i = 0; i < n; i++) { tmp += str.charAt(Math.floor(Math.random() * l)); } return tmp; } module.exports = randomString;

9.实现类似getElementsByClassName 的功能

自己实现一个函数,查找某个DOM节点下面的包含某个class的所有DOM节点?不允许使用原生提供的 getElementsByClassName querySelectorAll 等原生提供DOM查找函数。

function queryClassName(node, name) {  
  var starts = '(^|[ \n\r\t\f])', ends = '([ \n\r\t\f]|$)'; var array = [], regex = new RegExp(starts + name + ends), elements = node.getElementsByTagName("*"), length = elements.length, i = 0, element; while (i < length) { element = elements[i]; if (regex.test(element.className)) { array.push(element); } i += 1; } return array; }
这篇文章记录了自己平时学习过程中经常用到的一些小技巧,整理出来作为笔记,也希望对感兴趣的同学有所帮助

1 获取指定范围内的随机数

当我们需要获取指定范围(min,max)内的整数的时候,下面的代码非常适合。

function getRadomNum(min,max){
return Math.floor(Math.random() * (max - min + 1)) + min;
}

测试
在这里插入图片描述

2随机获取数组中的元素

function getRadomFromArr(arr){
return arr[Math.floor(Math.random()*arr.length)];
}

测试
在这里插入图片描述

3生成从0到制定数字数组

var arr=[],length=100,i=1;
for(;arr.push(i++)<length;){}
console.log(arr)

测试
在这里插入图片描述

4打乱数字数组的顺序

var arr = [1,2,3,4,5,6,7,'a','dsfs',8,9,'v'];
arr.sort( function(){return Math.random()-0.5});

测试
在这里插入图片描述

5对象转换为数组

//注意对象必须是以下格式的才可以通过此方式转化为数组
//获取的DOM集合,以及函数的arguments也可以通过此方式转化为数组
var obj={
0:'qian',
1:'long',
2:'chu',
3:'tian',
length:4
}
var _slice=[].slice;
var objArr=_slice.call(obj);

测试
在这里插入图片描述

6验证是否为数组

function isArray(obj){
return Object.prototype.toString.call(obj) === '[object Array]' ;
}

测试
在这里插入图片描述

7获取数组中最大或者最小值

function maxAndMin(arr){
return {
max:Math.max.apply(null,arr.join(',').split(',')),
min:Math.min.apply(null,arr.join(',').split(','))
}
}

该方法适合一维或者多维数组求最大最小值的情况
测试
在这里插入图片描述

8清空数组

//方式一 通过将长度设置为0
var arr=[1,2,3,4,5];
arr.length= 0;
 
//方式二 通过splice方法
var arr=[1,2,3,4,5];
arr.splice( 0,arr.length);
 
//方式三 通过将空数组 [] 赋值给数组(严格意义来说这只是将ary重新赋值为空数组,之前的数组如果没有引用在指向它将等待垃圾回收。)
var arr=[1,2,3,4,5];
arr=[];

9保留制定小数位

var num =4.345678;
num = num.toFixed( 4); // 4.3457 第四位小数位以四舍五入计算

10不要直接使用delete来删除数组中的元素

数组在js中也是对象,有时候我们可能会通过delete来删除数组中的元素,但是其实仅仅是将数组的元素的值赋值为了undefined。

var arr=[1,2,3,4,5,'谦龙','雏田'];
delete arr[5];
console.log(arr,arr[5],arr.length);

测试
在这里插入图片描述
可以通过splice来删除数组中的某一项

var arr=[1,2,3,4,5,'谦龙','雏田'];
arr.splice( 5,1);
console.log(arr,arr[5],arr.length);

11生成制定长度的随机字母数字字符串

function getRandomStr(len) {
var str = "";
for( ; str.length < len; str += Math.random().toString(36).substr(2));
return str.substr(0, len);
}

测试
在这里插入图片描述

12.null与undefined

null == undefined,null == null 返回true,有时候我们为了排除null 和 undefined可以使用如下的代码

function test(obj){
if(obj!=null){// obj除了undefined 和 null 之外都会走这里
....这里写代码逻辑
}
}

13.找出数组中出现次数最的元素,并给出其出现过的位置

function getMaxAndIndex( arr ){
var obj = {};
arr.forEach( function(item,index){
if(!obj[item]){
obj[item]= { indexs: [index]}
} else{
obj[item][ 'indexs'].push(index);
}
});
var num=0;//记录出现次数最大值
var str='';//记录出现次数最多的字符
var reArr;//返回最大值的位置数组
for(var attr in obj){
var temp=obj[attr]['indexs'];
if(temp.length>num){
num=temp.length;
str=attr;
reArr=temp;
}
}
return {
maxStr:str,
indexs:reArr
}
}

测试
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值