• 2018年各大互联网前端面试题二(滴滴打车)


    前言:

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

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

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

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

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

    1. var fullname = 'John Doe';
    2. var obj = {
    3. fullname: 'Colin Ihrig',
    4. prop: {
    5. fullname: 'Aurelio De Rosa',
    6. getFullname: function() {
    7. return this.fullname;
    8. }
    9. }
    10. };
    11. console.log(obj.prop.getFullname());
    12. var test = obj.prop.getFullname;
    13. 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 个数,例如:

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

    ...

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

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

    答案:

    1. const fibonacci = ((memo = [0, 1]) => {
    2. const fib = (n) => {
    3. let result = memo[n]
    4. if (typeof result !== "number") {
    5. result = fib(n - 1) + fib(n - 2)
    6. memo[n] = result
    7. }
    8. return result
    9. }
    10. return fib
    11. })()

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

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

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

    应该打印出hellohellohello.

    答案

    一个可行的做法如下:

    JavaScript 代码:
    1. String.prototype.repeatify = String.prototype.repeatify || function(times) {
    2. var str = '';
    3. for (var i = 0; i < times; i++) {
    4. str += this;
    5. }
    6. return str;
    7. };

    四:同字母异序

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

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

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

    (本题来源:github, LeetCode)

    答案:

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

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

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

    答案:

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

    1. using namespace std;
    2. int max(const int& a, const int& b)
    3. {
    4. return a>b?a:b;
    5. }
    6. int main()
    7. {
    8. int a[10005];
    9. int count = 0;
    10. while(cin >> a[count++]);
    11. count--;
    12. int ans = 0;
    13. int result = a[0];
    14. for(int i = 0; i < count; ++i)
    15. {
    16. ans = max(ans+a[i], a[i]);
    17. result = max(result, ans);
    18. }
    19. cout << result << endl;
    20. return 0;
    21. }
    22. /*
    23. -23 17 -7 11 -2 1 -34
    24. */

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

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

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

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

    1. package cn.thinking17;
    2. import java.io.*;
    3. import java.util.*;
    4. public class NOK {
    5. public static void main(String args[])
    6. {
    7. Scanner in = new Scanner(System.in);
    8. String nextLine = in.nextLine();
    9. int kth = in.nextInt();
    10. String[] splits = nextLine.split(" ");
    11. int[] numbers = new int[splits.length];
    12. for (int i = 0; i < numbers.length; i++) {
    13. numbers[i] = Integer.parseInt(splits[i]);
    14. }
    15. System.out.println(kthLargestElement(2, numbers));
    16. }
    17. public static int kthLargestElement(int k, int[] nums) {
    18. if (nums == null || nums.length == 0) {
    19. return 0;
    20. }
    21. if (k <= 0) {
    22. return 0;
    23. }
    24. return helper(nums, 0, nums.length - 1, nums.length - k + 1);
    25. }
    26. public static int helper(int[] nums, int l, int r, int k) {
    27. if (l == r) {
    28. return nums[l];
    29. }
    30. int position = partition(nums, l, r);
    31. if (position + 1 == k) {
    32. return nums[position];
    33. } else if (position + 1 < k) {
    34. return helper(nums, position + 1, r, k);
    35. } else {
    36. return helper(nums, l, position - 1, k);
    37. }
    38. }
    39. public static int partition(int[] nums, int l, int r) {
    40. int left = l, right = r;
    41. int pivot = nums[left];
    42. while (left < right) {
    43. while (left < right && nums[right] >= pivot) {
    44. right--;
    45. }
    46. nums[left] = nums[right];
    47. while (left < right && nums[left] <= pivot) {
    48. left++;
    49. }
    50. nums[right] = nums[left];
    51. }
    52. nums[left] = pivot;
    53. return left;
    54. }
    55. }

    原文作者:祈澈姑娘技术博客:https://www.jianshu.com/u/05f416aefbe1
    90后前端妹子,爱编程,爱运营,爱折腾。
    坚持总结工作中遇到的技术问题,坚持记录工作中所所思所见,欢迎大家一起探讨交流。

    关注「编程微刊」公众号 ,在微信后台回复「领取资源」,获取IT资源300G干货大全。

    公众号回复“1”,拉你进程序员技术讨论群.


  • 相关阅读:
    CSS之旅——第二站 如何更深入的理解各种选择器
    CSS之旅——第一站 为什么要用CSS
    记录一些在用wcf的过程中走过的泥巴路 【第一篇】
    asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result
    asp.net mvc 之旅—— 第一站 从简单的razor入手
    Sql Server之旅——终点站 nolock引发的三级事件的一些思考
    Sql Server之旅——第十四站 深入的探讨锁机制
    Sql Server之旅——第十三站 对锁的初步认识
    Sql Server之旅——第十二站 sqltext的参数化处理
    Sql Server之旅——第十一站 简单说说sqlserver的执行计划
  • 原文地址:https://www.cnblogs.com/ting6/p/9726140.html
Copyright © 2020-2023  润新知