前言:

近年来T行业就业者越来越多,有关于编程行业的高薪工作也变得越来越难找,竞争力越来越大,想要在众多的应聘者当中脱颖而出,面试题和笔试题一定要多加研究和琢磨,以下记录的是自己的面试过程之中遇到的一些比较经典的笔试题。

我找工作面试的时候没有太多的经验,也走了不少的弯路,但是有所记录,有所总结现在分享出来,很多企业的面试题并没有那么难,大多数都是来源于网络,只要自己准备充分,将网络上的各类面试题一一掌握,那么在面试中,就能做到胸有成竹。

记录滴滴打车一次面试JavaScript的经典面试题,当时回答不全,特意回来在百度上找了一些权威的答案,后来仔细想想,题目也是万变不离其宗好,几乎都是从多方位各角度考察一个知识点的。

一: this在javascript中是如何工作的

以下代码的结果是什么?请解释你的答案。

var fullname = 'John Doe';
var obj = {
fullname: 'Colin Ihrig',
prop: {
fullname: 'Aurelio De Rosa',
getFullname: function() {
return this.fullname;
}
}
}; console.log(obj.prop.getFullname()); var test = obj.prop.getFullname; console.log(test());

答案

代码打印了Aurelio De RosaJohn Doe。原因是在javascript中,一个函数的语境,也就是this这个关键词引用的,依赖于函数是如何调用的,不是如何定义的。

在第一个console.log()调用中, getFullname()是作为obj.prop的函数被调用的。因此,这里的语境指向后者并且函数返回对象的 fullname属性。相反,当 getFullname() 被指定为test的变量,那个语境指向全局对象(window)。因为test相当于设置为全局对象的属性。因为这个原因,函数返回window的一个fullname属性,这在这个案例中是在代码片段中第一行设置的。

二: 记忆化斐波那契函数(Memoization)

题目:斐波那契数列指的是类似于以下的数列:

1, 1, 2, 3, 5, 8, 13, ....

也就是,第 n 个数由数列的前两个相加而来:f(n) = f(n - 1) + f(n -2)

请你完成 fibonacci 函数,接受 n 作为参数,可以获取数列中第 n 个数,例如:

fibonacci(1) // => 1
fibonacci(2) // => 1
fibonacci(3) // => 2

...

测试程序会从按顺序依次获取斐波那契数列中的数,请注意程序不要超时,也不要添加额外的全局变量。

本题来源:《JavaScript 语言精髓》

答案:

const fibonacci = ((memo = [0, 1]) => {
const fib = (n) => {
let result = memo[n]
if (typeof result !== "number") {
result = fib(n - 1) + fib(n - 2)
memo[n] = result
}
return result
}
return fib
})()

三: 创建 “原生(native)” 方法

String 对象上定义一个 repeatify 函数。这个函数接受一个整数参数,来明确字符串需要重复几次。这个函数要求字符串重复指定的次数。举个例子:

JavaScript 代码:
1.  console.log('hello'.repeatify(3));

应该打印出hellohellohello.

答案

一个可行的做法如下:

JavaScript 代码:
 String.prototype.repeatify =  String.prototype.repeatify ||  function(times)  {
var str = ''; for (var i = 0; i < times; i++) {
str += this;
} return str;
};

四:同字母异序

同字母异序指的是两个字符串字母种类和字母的数量相同,但是顺序可能不同。

完成 isAnagram,接受两个字符串作为参数,返回true 或者 false 表示这两个字符串是否同字母异序。例如:

isAnagram("anagram", "nagaram") // => return true.
isAnagram("rat", "car") // => return false.

(本题来源:github, LeetCode)

答案:

const isAnagram = (str1, str2) => /* TODO */ {
return !str1.split('').sort().join('').replace(str2.split('').sort().join(''), '');
}

五:给定无序整数序列,求连续子串最大和。(滴滴出行2018校园招聘内推笔试)

输入描述:输入为整数序列,数字用空格分隔。例:-23 17 – 7 11 -2 1 -34
输出描述:输出位子序列的最大和。例:21

答案:

思路:动规思想,更新遍历到当前位置的最大值,并且每次都判断一下是否大于答案,注意全为负数和一个数这些特殊情况。遍历依次,求从第一个数开始累加的和,并记录最大值和最小值,最小值和最大值的差就是子序列最大的和。

   using namespace std;

int max(const int& a, const int& b)
{
return a>b?a:b;
} int main()
{
int a[10005];
int count = 0;
while(cin >> a[count++]);
count--;
int ans = 0;
int result = a[0];
for(int i = 0; i < count; ++i)
{
ans = max(ans+a[i], a[i]);
result = max(result, ans);
}
cout << result << endl;
return 0;
}
/*
-23 17 -7 11 -2 1 -34
*/

六:给定无序整数序列,求其中第K大的数。

输入描述:输入的第一行为整数序列,数字用空格分隔。例:45 67 33 21
输入的第二行一个整数K,K在数组长度范围以内。例:2

答案:(来源于博客,侵删)

采用两个指针left和right,分别从数组起始和末尾开始查找,满足left左侧的元素小于等于current值,right右侧的元素大于等于current,直至left = right。返回left指针位置,根据left和K的关系,确定下一步的查找范围。

package cn.thinking17;
import java.io.*;
import java.util.*;
public class NOK {
public static void main(String args[])
{
Scanner in = new Scanner(System.in);
String nextLine = in.nextLine();
int kth = in.nextInt();
String[] splits = nextLine.split(" ");
int[] numbers = new int[splits.length];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = Integer.parseInt(splits[i]);
}
System.out.println(kthLargestElement(2, numbers));
} public static int kthLargestElement(int k, int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
if (k <= 0) {
return 0;
}
return helper(nums, 0, nums.length - 1, nums.length - k + 1); }
public static int helper(int[] nums, int l, int r, int k) {
if (l == r) {
return nums[l];
}
int position = partition(nums, l, r);
if (position + 1 == k) {
return nums[position];
} else if (position + 1 < k) {
return helper(nums, position + 1, r, k);
} else {
return helper(nums, l, position - 1, k);
}
}
public static int partition(int[] nums, int l, int r) {
int left = l, right = r;
int pivot = nums[left];
while (left < right) {
while (left < right && nums[right] >= pivot) {
right--;
}
nums[left] = nums[right];
while (left < right && nums[left] <= pivot) {
left++;
}
nums[right] = nums[left];
}
nums[left] = pivot;
return left;
} }

文末福利:

福利一:前端,Java,产品经理,微信小程序,Python等资源合集大放送:https://www.jianshu.com/p/e8197d4d9880
福利二:微信小程序入门与实战全套详细视频教程

image

领取方式:
如果需要学习视频,欢迎关注 【编程微刊】微信公众号,回复【领取资源】一键领取以下所有干货资源,获取更多有用技术干货、文档资料。所有文档会持续更新,欢迎关注一起成长!

原文作者:祈澈姑娘
原文链接:https://www.jianshu.com/u/05f416aefbe1
创作不易,转载请告知

90后前端妹子,爱编程,爱运营,爱折腾。
坚持总结工作中遇到的技术问题,坚持记录工作中所所思所见,欢迎大家一起探讨交流。

JavaScript经典面试题(二)的更多相关文章

  1. 20道JavaScript经典面试题

    该篇文章整理了一些前端经典面试题,附带详解,涉及到JavaScript多方面知识点,满满都是干货-建议收藏阅读 前言 如果这篇文章有帮助到你,️关注+点赞️鼓励一下作者,文章公众号首发,关注 前端南玖 ...

  2. javascript经典面试题之for循环click

    经典重现 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf- ...

  3. 前端必会的Javascript经典面试题

    这是前端最基础的问题,也是在面试中难倒无数同学的经典问题 01. Javascript 数据类型 Javascript 数据类型 = 基本类型 + 引用类型 ES6 之前 5 + 1 = 6 种 ES ...

  4. C++经典面试题(二)

    近期看一些面试题,认为假设自己被问到了,并不能非常利落的回答出来. 一是从来没有这个意识,二是没有认真的梳理下. 以下对这些题做出分析,哈!个人能力有限,当中难免有疏漏,欢迎大家补充咯. 11.引用与 ...

  5. JavaScript经典面试题系列

    1.javascript的typeof返回哪些数据类型 Object number function boolean underfind 2.例举3种强制类型转换和2种隐式类型转换? 强制(parse ...

  6. 前端javaScript经典面试题

    1.alert(1&&2),alert(1||0) alert(1&&2)的结果是2 只要“&&”前面是false,无论“&&”后面是t ...

  7. JavaScript经典代码【二】【javascript判断用户点了鼠标左键还是右键】

    IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0 默认.没有按任何按钮. events.b ...

  8. JavaScript经典作用域问题(转载)

    题目 var a = 10; function test(){ a = 100; console.log(a); console.log(this.a); var a; console.log(a); ...

  9. Web前端经典面试试题(二)

    上次由于时间有限只分享了一部分的前端面试题,所以本篇继续分享前端经典面试试题 一. 栈和队列的区别? 栈的插入和删除操作都是在一端进行的,而队列的操作却是在两端进行的. 队列先进先出,栈先进后出. 栈 ...

随机推荐

  1. RocketMQ集群消费的那些事

    说明 RocketMQ集群消费的时候,我们经常看到类似注释里面 (1,(2 的写法,已经有时候有同学没注意抛异常的情况就是(3 模拟的情况.那么这3种情况到底是怎么样的呢?你是否都了然于心呢?下面我们 ...

  2. js数组遍历和对象遍历小结

    数组的遍历 for循环 for(var j = 0,len = arr.length; j < len; j++){ console.log(arr[j]); } forEach,性能比for还 ...

  3. PythonNET网络编程4

    本地套接字 Linux 文件 b(块设备文件) c(字符设备文件) d(目录) -(普通文件) l(链接) s(套接字) p(管道) 作用:用于本地不同的程序间进行通信 创建流程 创建本地套接字 so ...

  4. 【习题 6-1 UVA-673】Parentheses Balance

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 括号匹配. 栈模拟就好. 多种括号也是一样可以做的. [代码] #include <bits/stdc++.h> usi ...

  5. [Angular] Use Angular’s @HostBinding and :host(...) to add styling to the component itself

    One thing that we can do is to add styles directly to HTML elements that live within our component. ...

  6. 11.Cocos2dx2.2下使用JNI技术调用jar包里面的一些方法遇到的一些问题及解决方式。

    <span style="font-family: Arial, Helvetica, sans-serif;">步骤一:导入JniHelper.h头文件.</s ...

  7. vue 图片lazyload

    今天看到我一醉哥的一篇朋友圈分享:<不如我们从头来过 | 掘金> 看完之后,百感交集,互联网的浪潮使创业公司如雨后春笋般崛起, 每一个初创公司都会有一群怀着美好愿景的小伙伴, 但是当寒冬来 ...

  8. git各种命令 & git merge和git rebase的区别

    git merge 和 rebase的区别: http://blog.csdn.net/jollyjumper/article/details/24743751 对于两个分支而言,rebase和mer ...

  9. log4j 2.x 版本的 properties 配置

    #用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出status = debugdest = errname = PropertiesConf ...

  10. UVA 11367 - Full Tank? dijkstra+DP

    传送门:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...