array js 二分法_JS常见的算法

虽说我们很多时候前端很少有机会接触到算法。大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面。实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的。如果将来当我们面对较为复杂的问题,这些基础知识的积累可以帮助我们更好的优化解决思路。下面罗列在前端面试中经常撞见的几个问题吧。

Q1 判断一个单词是否是回文?

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

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

function checkPalindrom(str) {

return str == str.split('').reverse().join('');

}

Q2 去掉一组整型数组重复的值

比如输入: [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

if(!hashTable[arr[i]]) {

hashTable[arr[i]] = true;

data.push(arr[i]);

}

}

return data

}

module.exports = unique;

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

给出一段英文连续的英文字符窜,找出重复出现次数最多的字母

输入 : afjghdfraaaasdenas

输出 : a

前面出现过去重的算法,这里需要是统计重复次数。

function findMaxDuplicateChar(str) {

if(str.length == 1) {

return str;

}

let charObj = {};

for(let i=0;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;

Q4 排序算法

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

冒泡排序:

function bubbleSort(arr) {

for(let i = 0,l=arr.length;i

for(let j = i+1;j

if(arr[i]>arr[j]) {

let tem = arr[i];

arr[i] = arr[j];

arr[j] = tem;

}

}

}

return arr;

}

module.exports = bubbleSort;

除了冒泡排序外,其实还有很多诸如插入排序,快速排序,希尔排序等。每一种排序算法都有各自的特点。全部掌握也不需要,但是心底一定要熟悉几种算法。 比如快速排序,其效率很高,而其基本原理如图(来自wiki):

算法参考某个元素值,将小于它的值,放到左数组中,大于它的值的元素就放到右数组中,然后递归进行上一次左右数组的操作,返回合并的数组就是已经排好顺序的数组了。

快速排序:

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

if(arr[i]>q) {

rightArr.push(arr[i]);

}else{

leftArr.push(arr[i]);

}

}

return [].concat(quickSort(leftArr),[q],quickSort(rightArr));

}

module.exports = quickSort;

二分法

二分法查找的前提;数组必须为有序

思路:找到数组的中间数(midval)和要查找的数(findval),若findval

var arr = [1,4,6,8,9,10,56];

function binarySearch(arr,findval,leftIndex,rightIndex){

var midIndex = Math.floor((leftIndex+rightIndex)/2);

var midval = arr[midIndex];

if(midval>findval){

//左边找

binarySearch(arr,findval,leftIndex,midIndex);

alert("left");

}else if(midval

//右边找

binarySearch(arr,findval,midIndex,rightIndex);

alert("right");

}else {

document.write("找到下标为" +midIndex);

}

}

//测试:

binarySearch(arr,10,0,arr.length-1);

插入排序

插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

function insertionSort(array) {

console.time('插入排序耗时:');

for (var i = 1; i < array.length; i++) {

var key = array[i];

var j = i - 1;

while ( array[j] > key) {

array[j + 1] = array[j];

j--;

}

array[j + 1] = key;

}

console.timeEnd('插入排序耗时:');

return array;

}

var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];

console.log(insertionSort(arr));

安利大家一个学习的地址,通过动画演示算法的实现。

Q5 不借助临时变量,进行两个整数的交换

输入 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;

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

数列长度限定在9.

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列主要考察递归的调用。我们一般都知道定义

fibo[i] = fibo[i-1]+fibo[i-2];

生成斐波那契数组的方法

function getFibonacci(n) {

var fibarr = [];

var i = 0;

while(i

if(i<=1) {

fibarr.push(i);

}else{

fibarr.push(fibarr[i-1] + fibarr[i-2])

}

i++;

}

return fibarr;

}

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

Q7 找出下列正数组的最大差值比如:

输入 [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;

}

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

实现一个算法,随机生成指制定长度的字符窜。比如给定 长度 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;

Q9 实现类似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;

}

Q10 使用JS 实现二叉查找树(Binary Search Tree)

一般叫全部写完的概率比较少,但是重点考察你对它的理解和一些基本特点的实现。 二叉查找树,也称二叉搜索树、有序二叉树(英语:ordered binary tree)是指一棵空树或者具有下列性质的二叉树:

任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

任意节点的左、右子树也分别为二叉查找树;

没有键值相等的节点。二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、multiset、关联数组等。

在写的时候需要足够理解二叉搜素树的特点,需要先设定好每个节点的数据结构

class Node {

constructor(data, left, right) {

this.data = data;

this.left = left;

this.right = right;

}

}

树是有节点构成,由根节点逐渐延生到各个子节点,因此它具备基本的结构就是具备一个根节点,具备添加,查找和删除节点的方法.

class BinarySearchTree {

constructor() {

this.root = null;

}

insert(data) {

let n = new Node(data, null, null);

if (!this.root) {

return this.root = n;

}

let currentNode = this.root;

let parent = null;

while (1) {

parent = currentNode;

if (data < currentNode.data) {

currentNode = currentNode.left;

if (currentNode === null) {

parent.left = n;

break;

}

} else {

currentNode = currentNode.right;

if (currentNode === null) {

parent.right = n;

break;

}

}

}

}

remove(data) {

this.root = this.removeNode(this.root, data)

}

removeNode(node, data) {

if (node == null) {

return null;

}

if (data == node.data) {

// no children node

if (node.left == null && node.right == null) {

return null;

}

if (node.left == null) {

return node.right;

}

if (node.right == null) {

return node.left;

}

let getSmallest = function(node) {

if(node.left === null && node.right == null) {

return node;

}

if(node.left != null) {

return node.left;

}

if(node.right !== null) {

return getSmallest(node.right);

}

}

let temNode = getSmallest(node.right);

node.data = temNode.data;

node.right = this.removeNode(temNode.right,temNode.data);

return node;

} else if (data < node.data) {

node.left = this.removeNode(node.left,data);

return node;

} else {

node.right = this.removeNode(node.right,data);

return node;

}

}

find(data) {

var current = this.root;

while (current != null) {

if (data == current.data) {

break;

}

if (data < current.data) {

current = current.left;

} else {

current = current.right

}

}

return current.data;

}

}

module.exports = BinarySearchTree;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python缩进说法_【多选题】关于Python程序中与“缩进”有关的说法中,以下选项中错误的是()。...

问题&#xff1a;【多选题】关于Python程序中与“缩进”有关的说法中&#xff0c;以下选项中错误的是&#xff08;&#xff09;。更多相关问题 因方某将赵某打伤&#xff0c;方某住所地的市劳动教养委员会对方某作出劳动教养2年的决定&#xff0c;并将方某送交劳动 根据行政诉讼…

智能测井解释

1 智能测井解释的需求分析 1、岩性识别 2、储层划分 3、参数计算 4、流体判别 5、井数据批量处理 岩性识别&#xff1a;分类任务 曲线预测、曲线补齐&#xff1a;回归任务 2 岩性识别 2.1 岩性识别主要方法简介 目前岩性识别的方法主要有重磁、测井、地震、遥感、电 磁、地…

wpf 点击按钮弹出选择框_关于WPF的弹出窗口

几个重要的概念需要清楚&#xff1a;Show和ShowDialog区别1、调用Show方法后弹出子窗口后&#xff0c;线程会继续往下执行。调用ShowDialog方法弹出子窗口后&#xff0c;线程会阻塞&#xff0c;直到子窗口关闭才继续往下执行。2、ShowDialog弹出的子窗口会使父窗口不能获得焦点…

基于移动设备的OCR识别工作进展(1)

1 模型调研 模型1&#xff1a;Tesseract-OCR 模型2&#xff1a;PaddleOCR Android上面有体验版的demo&#xff1a;https://ai.baidu.com/easyedge/app/openSource?frompaddlelitePP-OCR模型&#xff1a;https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/README_…

2020.2idea创建web_IntelliJ IDEA 2017.3 完整的配置Tomcat运行web项目教程(多图)

小白一枚&#xff0c;借鉴了好多人的博客&#xff0c;然后自己总结了一些图&#xff0c;尽量的详细。在配置的过程中&#xff0c;有许多疑问。如果读者看到后能给我解答的&#xff0c;请留言。Idea请各位自己安装好&#xff0c;还需要安装Maven和Tomcat&#xff0c;各自配置好环…

swift 将图片保存到本地_Swift实现截屏并保存相册

func saveToLocal() {//截屏let screenRect UIScreen.mainScreen().boundsUIGraphicsBeginImageContext(screenRect.size)let ctx:CGContextRef UIGraphicsGetCurrentContext()!self.view.layer.renderInContext(ctx)let image UIGraphicsGetImageFromCurrentImageContext()…

OCR基本原理

学习内容为《动手学OCR.pdf》 1 OCR基础 1.1 OCR是什么 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;&#xff1b; 传统意义上的OCR&#xff1a;面向扫描文档类对象&#xff1b; 一般意义上的OCR&#xff1a;场景文字识别&#xff08…

实用供暖通风空调设计手册 第三版_实用供热空调设计手册第三版即将出版随想...

看到西北院组织豪华的暖通空调大师阵容编写的《实用供热空调设计手册》第三版即将出版的信息&#xff0c;暖通空调人都期盼着2020年底见到具有更多新理念、新技术、新方法、新设备、新材料内容的新版《实用供热空调设计手册》。看到《实用供热空调设计手册》第二版&#xff0c;…

json非法字符有哪些_JSON文件中非法字符的处理

JSON是一种很好的数据格式&#xff0c;但是简单之处也有麻烦的地方&#xff0c;比如如果JSON的字符串里面出现了双引号的话&#xff0c;那真是搞死人了。之前我很傻&#xff0c;每次抛出异常&#xff0c;我就根据异常显示的位置&#xff0c;去慢慢一个一个找错误的地方&#xf…

python查询模块路径_Visual Studio 2017中的Python无法通过“搜索路径”查找模块

我正在尝试将一个带有python虚拟环境的现有python项目添加到visual studio 2017&#xff0c;以便我可以调试它。 该项目还有一些外部依赖项&#xff0c; 所有内容都安排在以下文件夹中 C:\myproject\code C:\myproject\portablepython C:\myproject\pylibrary 我使用了创建项目…

python pyquery库_python解析HTML之:PyQuery库的介绍与使用

前言Python关于爬虫的库挺多的&#xff0c;也各有所长。了解前端的也都知道&#xff0c; jQuery 能够通过选择器精确定位 DOM 树中的目标并进行操作&#xff0c;所以我想如果能用 jQuery 去爬网页那就 cool 了。就搜了下看 Python 有没有与 DOM 相关的库什么的&#xff0c;还真…

android 北斗定位代码_iPhone 11 确认支持北斗导航,真相来了!

点击 哎咆科技 关注我们最近“北斗”火了。因为7月31日&#xff0c;北斗三号全球卫星导航系统正式开通。截止8月7日&#xff0c;微博话题“北斗三号全球卫星导航系统正式开通”已有5.3亿次阅读、8万次讨论。北斗三号全球卫星导航系统的开通&#xff0c;意味着中国自主研发的北斗…

冯雪 手术机器人的应用_未来达芬奇手术机器人的应用将更为广阔

达芬奇手术机器人在缝合葡萄皮。在两三厘米见方的人体空间内&#xff0c;机械臂可以如绣花般精细操作。如今&#xff0c;手术机器人正在让很多原本无法想象的手术场景变为现实。其中&#xff0c;达芬奇外科手术机器人系统(以下简称“达芬奇手术机器人”)更是代表了该领域的尖端…

python如何读取数据时出现错误_连接数据库时出现的错误,怎样解决??

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Traceback (most recent call last): File "src\pymssql.pyx", line 636, in pymssql.connect File "src\_mssql.pyx", line 1957, in _mssql.connect File "src\_mssql.pyx", line 676, in _mssql…

FCENet学习笔记

论文&#xff1a; Fourier Contour Embedding for Arbitrary-Shaped Text Detection Yiqin Zhu and Jianyong Chen and Lingyu Liang and Zhanghui Kuang and Lianwen Jin and Wayne Zhang CVPR, 2021 1 动机 2021年金连文团队提出了一个FCENet&#xff0c;方法比较新颖&…

10a大电流稳压芯片_IC芯片大小的完整10A DC/DC电源

引言对于数字系统设计师来说&#xff0c;DC/DC电源的定义和设计常常是最后一个设计步骤。设计师必须在DC/DC稳压器电路的设计、布局和调试上花费宝贵的时间。确定合适的DC/DC控制器IC、MOSFET、电感器、电容器、电阻器和二极管只是所面临的诸多挑战的一部分。电源的布局、元件选…

linux shell rman删除归档_我们一起学一学渗透测试——黑客应该掌握的Linux基础

点击上方「蓝字」关注我们各位新老朋友们&#xff1a;大家好&#xff0c;我是菜鸟小白。欢迎大家关注“菜鸟小白的学习分享”公众号&#xff0c;菜鸟小白作为一名软件测试工程师&#xff0c;会定期给大家分享一些测试基础知识、测试环境的搭建和python学习分享&#xff0c;另外…

PAN++学习笔记

1 主要创新点 文本检测和识别两个任务结合起来&#xff0c;作为互补&#xff0c;提高检测和识别精度&#xff1b;处理不规则形状的文本&#xff1b;提供一个高效的端到端框架PAN&#xff0c;对实时的应用场景友好。 2 已有工作的痛点 将文本检测和识别任务分开&#xff0c;不…

postgresql 遍历字符串数组_每日一道编程题(348):1005.K次取反后最大化的数组和...

1005.K次取反后最大化的数组和每日编程中遇到任何疑问、意见、建议请公众号留言或直接撩Q474356284(备注每日编程)给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#xff1a;我们选择某个个索引 i 并将 A[i] 替换为 -A[i]&#xff0c;然后总共重复这个过程 K 次…

7安装sql cent os server_CentOS7 安装并使用SQL Server

CentOS7 安装并使用SQL ServerLinux 上的 SQL Server 安装指南笔者基于CentOS7进行安装操作下载 Microsoft SQL Server Red Hat 存储库配置文件sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server.repo运行以下命令&…