前言:
近年来 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 Rosa 和 John 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
- ...
测试程序会从按顺序依次获取斐波那契数列中的数, 请注意程序不要超时, 也不要添加额外的全局变量
答案:
- 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(''), '');
- }
五: 给定无序整数序列, 求连续子串最大和
输入描述: 输入为整数序列, 数字用空格分隔例:-23 17 7 11 -2 1 -34
输出描述: 输出位子序列的最大和例: 21
答案:
遍历依次, 求从第一个数开始累加的和, 并记录最大值和最小值, 最小值和最大值的差就是子序列最大的和
- package coding;
- import java.util.*;
- public class Main {
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- String nextLine = in.nextLine();
- String[] splits = nextLine.split(" ");
- ArrayList<Integer> A = new ArrayList<Integer>();
- for (int i = 0; i <splits.length; i++) {
- A.add(Integer.parseInt(splits[i])) ;
- }
- if(A==null||A.size()==0) return ;
- ArrayList<Integer> result = new ArrayList<Integer>();
- result.add(-1);
- result.add(-1);
- int min = 0;
- int max = Integer.MIN_VALUE;
- int minpos = -1;
- int sum = 0;
- for(int i = 0;i<A.size();i++){
- sum += A.get(i);
- if(sum - min> max){
- result.set(0 , minpos);
- max = sum - min;
- result.set(1 , i);
- }
- if(sum <min){
- min = sum;
- minpos = i;
- }
- }
- int temp = result.get(0);
- result.set(0 , temp + 1);
- int re = 0;
- for(int i = result.get(0); i <= result.get(1); i ++){
- re += A.get(i);
- }
- System.out.println(max);
- }
- }
六: 给定无序整数序列, 求其中第 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
福利二: 微信小程序入门与实战全套详细视频教程
来源: http://www.jianshu.com/p/e45cb1fcc4c2