JavaScript经典面试题(二)

前言:

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

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

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

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

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

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()); 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这个关键词引用的,依赖于函数是如何调用的,不是如何定义的。github

在第一个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 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 })() 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)); 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; }; 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(''), ''); } 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 */ 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; } } 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后前端妹子,爱编程,爱运营,爱折腾。坚持总结工做中遇到的技术问题,坚持记录工做中所所思所见,欢迎你们一块儿探讨交流。

相关文章
相关标签/搜索