前言:

近年来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. GO语言学习(十六)Go 语言结构体

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...

  2. Java vs C++:子类覆盖父类函数时缩小可访问性的不同设计

    Java 和 C++ 都是面向对象的语言,允许对象之间的继承.两个语言的继承都设置有允许子类覆盖父类的“虚函数”,加引号是因为 Java 中没有虚函数这一术语,但是我们的确可以把 Java 的所有函数 ...

  3. 页面事件(Init,Load,PreRender)执行顺序

    简介 对由 Microsoft® Internet 信息服务 (IIS) 处理的 Microsoft® ASP.NET 页面的每个请求都会被移交到 ASP.NET HTTP 管道.HTTP 管道由一系 ...

  4. vue使用(三)

    本节目标:获取后端api数据 需求:一个按钮,点击之后将服务器上的数据获取到,并显示出来 方法一: 1. 准备工作, (1)安装官方插件 vuedemo02>npm install vue-re ...

  5. PHP URL参数获取方式的四种例子

    在已知URL参数的情况下,我们可以根据自身情况采用$_GET来获取相应的参数信息($_GET['name']);那,在未知情况下如何获取到URL上的参数信息呢? 第一种.利用$_SERVER内置数组变 ...

  6. 推荐一下《聊聊JVM》的专栏

    依照惯例新开了一个专栏后要单推一下.推荐一下<聊聊JVM的专栏>,网上关于JVM的文章太多,这个专栏希望能在已有的资料的基础上写出点新意,对一些重要的概念归纳总结,说说自己的观点.理解和实 ...

  7. Android5.0(Lollipop) BLE蓝牙4.0+浅析demo连接(三)

    作者:Bgwan链接:https://zhuanlan.zhihu.com/p/23363591来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. Android5.0(L ...

  8. ZOJ 1796 Euchre Results 数学水题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1796 题意: 四个人玩游戏,已知三个人的输赢情况,求第四个人的输赢情况. ...

  9. Eclipse下配置Ant脚本 自己主动打包带签名的Android apk

    尽管eclipse非常少用了,可是在古老的项目上还是会用到.一个麻烦事是打带签名包的时候.非常不方便.下边纪录下配置ant,自己主动打包带签名apk的过程,作为备忘.(PC环境为MAC) 1,第一步得 ...

  10. Unity中做放大镜 效果

    孙广东  2015.8.16 事实上和 小地图都几乎相同了. 还是要借助 还有一个相机 目的: 这篇文章的主要目的是  要给你一个想法  怎样做放大境效果 . 在unity中能够简单的实现放大镜效果啊 ...