前端面试中的算法题

前言

本人最近去了一次面试,被问到两题面试题,是考察算法的,觉得挺基础的,也比较有趣,分享一下

第一题

第一题的要求是,根据顺序输出二叉树的每个节点的值。这一题在算法中比较的基础,其实也没有什么难度。面试官的要求是需要使用时间复杂度为O(n)的方式进行输出。可能当时有点紧张吧,没有仔细思考之后就开始动手写代码了。那接下来,我就先讲一下正确的解题思路吧

解题思路

其实这里考察了一下队列的知识。下面我们来看一下队列的基本描述图:

队列图

根据队列的思想,首先访问第一个节点,然后输出该节点的值,然后判断它是否具备子节点。如果具备将子节点放入队列,然后依次遍历队列,知道遍历到队列的最后一个。

代码

var node7 = {
    num: 7,
    children: []
};             //节点7
var node6 = {
    num: 6,
    children: []
};
var node5 = {
    num: 5,
    children: []
};
var node4 = {
    num: 4,
    children: []
};
var node3 = {
    num: 3,
    children: [node6, node7]
};
var node2 = {
    num: 2,
    children: [node4, node5]
};
var node1 = {
    num: 1,
    children: [node2, node3]
};

var queue = [];      //队列
queue.push(node1);           //现将第一个节点push进去
for(var i=0; i<queue.length ; i++){
    var node = queue[i];
    console.log(node.num);
    if(node.children.length !== 0){             //判断是否含有子节点
        for(var j=0; j<node.children.length ; j++){
            queue.push(node.children[j]);
        }
    }
}

第二题部分

第二题

第二题的要求是给定一个字符串,这个字符串是由()、[]两种括号组成的,还是要求算法复杂度是O(n),即遍历一次字符串。当时,看到这道题内心是拒绝的,由于长时间没有接触算法的东西,一下子也没什么好的办法。在思考的过程中,想出过一种解决方案:两个循环,从两边开始遍历,相等的情况直接提取,不相等的情况,右边的变量继续往左移动,直到第二次相等,将剩余的字符串提取出来,继续进行相同的操作,直到最后两边的变量重合。

第一种方案图

其实这是一种解决方案,只是它的算法复杂度并不等于O(n),所以,我们来看接下来的解决方案。
经过面试官的提醒,我顺利地想到了使用栈的方式去解决问题,栈的大体介绍如下:

解题思路

首先,我们建立一个栈对象,之后遍历字符串,当前字符与下一个字符不相同时,去判断栈的最后一位是否与之相同,如果相同,则将栈中最后一位与当期位一起打印出来,如果不相同,则将当前的字符压入栈中,依次往下。

栈图

代码

var stack = [];
var string1 = '(([]()[])[])';

for(var i=0; i < string1.length; i++){
    if(countNum(string1[i]) + countNum(string1[i+1]) === 0){    //首先判断当前字符与下一个字符是否匹配,若匹配直接打印,并将变量i加一
        console.log(string1[i] + string1[i+1]);
        i++;
        continue;
    }else{      //若不匹配
        if(stack.length === 0){    先查看栈内是否有字符,没有就直接放入栈中
            stack.push(string1[i]);
            continue;
        }else{       //若有的话,判断栈的最后一个字符是否与之匹配
            var len = stack.length;
            if(countNum(stack[len-1]) + countNum(string1[i]) === 0){   直接匹配的话,则打印两个字符,并且将栈的最后一个字符去除
                console.log(stack[len-1]+string1[i]);
                stack.pop();
                continue;
            }else{       //若不匹配,则将该字符继续放入栈中
                stack.push(string1[i]);
                continue;
            }
        }
    }
}

function countNum(chr){                   //为了方便匹配每个字符,将字符用数字表示
    switch(chr){
        case '(': return 1;break;
        case ')': return -1; break;
        case '[': return 2; break;
        case ']': return -2; break;
        default: return 0;
    }
}

经历过这一次的面试,我忽然明白自己做前端这么久,却忽略了计算机中最重要的东西——算法。或许,做前端的多数时候都在处理用户交互和UI组件,以及界面等问题吧,哈哈。但是,现在才明白做前端的,不能将自己局限起来,或许不久的将来,前端也会注重以前我们忽略的东西。

如果你喜欢我的文章,就给个喜欢与关注吧。我的文章会不定期的更新,谢谢点赞和支持。当然,你也可以留言,与我一起研究和讨论。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容

  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 3,277评论 0 19
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,279评论 25 707
  • 一、 C/C++程序基础 面试例题1——分析代码写输出(一般赋值语句的概念和方法)。 面试例题2—...
    LuckTime阅读 1,955评论 2 42
  • 烟雨成雪冰凝水,白雾飞散忽现谁。青衣碧发兰溪上,紫衣梦醒却成灰。
    紫衣寒冰阅读 206评论 0 0
  • 大连路在修立交桥,所以两边的人行道被挡板硬生生的强制霸占,小得只容两人并排通过,决策者明显没有把胖子考虑在行人中,...
    我爷爷就是割猪匠阅读 249评论 4 1