1、长字符串寻找给定的子串的索引

直接使用indexof

2、两个两个有序的数组

/*** * @param A int整型一维数组 * @param B int整型一维数组 * @return void*/function merge( A, m, B, n ) {// 每次从后面插入最大的元素let len = m+n;while(n>0 && m>0){if(A[m-1]>B[n-1]){A[--len] = A[--m];}else{A[--len] = B[--n];}}while(n){A[--len] = B[--n];}return A;
}
module.exports = {merge : merge
};

3、反转链表

/*** Definition for singly-linked list.* function ListNode(val) {*     this.val = val;*     this.next = null;* }*/
/*** @param {ListNode} head* @return {ListNode}*/
var reverseList = function(head) {//头插法let h = null;let p = null;while(head!=null){p = head.next;head.next = h;h = head;head = p;}return h;
};

4、两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。先返回较小的下标(下标从0开始)

/*** @param {number[]} nums* @param {number} target* @return {number[]}*/
var twoSum = function(nums, target) {let map = [];let res = [];for(let i=0; i<nums.length; i++){let p = target- nums[i];if(map[p]!=null){res[0] = map[p];res[1] = i;break;}else{map[nums[i]] = i;}}return res;
};

5、找最小的k个数

给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组

function GetLeastNumbers_Solution(input, k)
{if(k>input.length){return [];}return input.sort((a,b) => (a-b)).slice(0,k);
}

6、给定一个链表,判断链表中是否有环。

快慢指针

/*** Definition for singly-linked list.* function ListNode(val) {*     this.val = val;*     this.next = null;* }*//*** @param {ListNode} head* @return {boolean}*/
var hasCycle = function(head) {if(head==null) return false;let fast = head;let slow = head;while(fast!=null && fast.next!=null){fast = fast.next.next;slow = slow.next;if(fast == slow){return true;}}return false;
};

7、链表中环的入口节点

/** function ListNode(x){*   this.val = x;*   this.next = null;* }*//*** * @param head ListNode类 * @return ListNode类*/
function detectCycle( head ) {if(head == null) {return head;}let slow = head;let fast = head;while(fast!=null && fast.next!=null){fast = fast.next.next;slow = slow.next;if(slow==fast){let slow2 = head;while(slow2 != slow){slow = slow.next;slow2 = slow2.next;}return slow2;}}}
module.exports = {detectCycle : detectCycle
};

8、调整数组顺序使奇数位于偶数前面

/*** @param {number[]} nums* @return {number[]}*/
var exchange = function(nums) {let i=0,j=nums.length-1;while(i<j){while(i<j && nums[i]%2==1){i++;}while(i<j && nums[j]%2==0){j--;}if(i<j){let temp = nums[i];nums[i] = nums[j];nums[j] = temp; }}return nums;
};

9、手写快排

function MySort( arr ) {QuickSort(arr,0,arr.length-1);return arr;
}
function QuickSort(arr, low, high){let l = low;let h = high;if(l<h){let p = arr[l];while(l<h){while(l<h && arr[h]>=p) h--;arr[l] = arr[h];while(l<h && arr[l]<=p) l++;arr[h] = arr[l];}arr[l] = p;QuickSort(arr,low,l-1);QuickSort(arr,l+1,high);}
}

10、手写树的遍历

分别按照二叉树先序,中序和后序打印所有的节点。

/** function TreeNode(x) {*   this.val = x;*   this.left = null;*   this.right = null;* }*//*** * @param root TreeNode类 the root of binary tree* @return int整型二维数组*/
function threeOrders( root ) {// write code herelet res=[];let a1 = [], a2=[], a3=[];pre(root,a1);mid(root,a2);post(root,a3);res.push(a1,a2,a3);return res;
}
function pre(root, a1){if(root!=null) a1.push(root.val);if(root.left) pre(root.left,a1);if(root.right) pre(root.right,a1);
}
function mid(root, a2){if(root.left) {mid(root.left,a2);}if(root!=null) a2.push(root.val);if(root.right) mid(root.right, a2);
}
function post(root, a3){if(root.left){post(root.left, a3);}if(root.right){post(root.right, a3);}if(root!=null) a3.push(root.val);
}
module.exports = {threeOrders : threeOrders
};

11、在二叉树中找到两个节点的最近公共祖先

function lowestCommonAncestor( root ,  o1 ,  o2 ) {return Ancestor(root, o1, o2).val;
}function Ancestor(root, o1, o2){//1. 遍历到叶子节点的孩子、o1或o2为根节点if(root==null || root.val==o1 || root.val==o2){return root;}//2. 分别遍历左右两侧中 o1和o2的公共祖先节点let left = Ancestor(root.left, o1, o2);let right = Ancestor(root.right, o1, o2);//3. o1和o2都在右子树中if(left==null){return right;}//4. o1和o2都在左子树中if(right==null){return left;}//5. o1和o2分别在左右子数中return root;
}

12、括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

方法:使用深度优先遍历。

使用加法,即 left 表示「左括号使用了几个」,right 表示「右括号使用了几个」,可以画出另一棵递归树。

/*** @param {number} n* @return {string[]}*/
var generateParenthesis = function(n) {let res = [];// 1. 生成的括号对数为0if(n==0){ return res;}//2. 深度优先遍历。//当前的括号组合为"",左括号使用了0个,右括号使用了0个,结果数组res, 生成n对括号dfs("", 0, 0, res, n);return res;
};
function dfs(cur, left, right, res, n){//1. 获取一对括号组合if(left == n && right == n){res.push(cur);return;}//2. 剪枝:右括号的数量多于左括号,错误if(left < right){return;}//3. 添加一个左括号if(left < n){dfs(cur+"(", left+1, right, res, n);}//4. 添加一个右括号if(right < n){dfs(cur+")", left, right+1, res, n);}
}

13、数组中有一个出现次数超过一半的数字,如何快速找到

摩尔投票法: 核心理念为 票数正负抵消 。此方法时间和空间复杂度分别为 O(N)O(N) 和 O(1)O(1) ,为本题的最佳解法。(将出现次数超过一半的数字记为众数)

  • 推论一: 若遇与 众数 相同的数字 +1 ,不相同 −1 ,则一定有所有数字的票数和 >0 。
  • 推论二: 若数组的前 a 个数字的 票数和 =0 ,则 数组剩余 (n−a) 个数字的 票数和一定仍 >0,即后 (n-a)个数字的 众数仍为 x。

算法流程:

  1. 初始化: 票数统计 votes = 0 , 要找的数字记为x;
  2. 循环: 遍历数组 nums 中的每个数字 num ;
  3. 当 票数 votes 等于 0 ,则假设当前数字 num 是众数;
  4. 当 num = x 时,票数 votes 自增 1 ;当 num != x 时,票数 votes 自减 1 ;
  5. 返回值: 返回 x 即可;
/*** @param {number[]} nums* @return {number}*/
var majorityElement = function(nums) {let x = nums[0], vote = 0;for(let i=0; i<nums.length; i++){//1. 票数为0,重新确定众数if(vote == 0) x = nums[i];//2. 与当前众数相同,+1;不同,-1if(nums[i] == x) vote++;else vote--;}//3. 验证 x 是否为众数let count = 0;for(let i=0; i<nums.length; i++){if(nums[i] == x) count++;}if(count > nums.length/2){return x;}else{return 0;}
};

14、求二叉树的最大深度

/*** Definition for a binary tree node.* function TreeNode(val) {*     this.val = val;*     this.left = this.right = null;* }*/
/*** @param {TreeNode} root* @return {number}*/
var maxDepth = function(root) {if(root==null) return 0;return Math.max(maxDepth(root.left) ,maxDepth(root.right))+1;
};

15、单链表的实现

16、数组去重,数组里面存的是数字或字符串

set集合

17、爬楼梯

18、获取一个链表的倒数第k个结点

19、冒泡排序

20、两个栈模拟一个队列,实现删除插入等功能

29、酷家乐面试算法题相关推荐

  1. 从酷家乐面试官到收获阿里Offer过程中的一些心得与思考

    本文来自读者投稿,作者:绯凡,跟大家聊聊从酷家乐面试官到收获阿里 Offer 过程中的一些心得与思考,希望对大家的格局和理解有些帮助 https://juejin.im/post/5e842e6c51 ...

  2. 酷家乐前端开发工程师一面

    写在前面 周五面试酷家乐 面试官上来直接五道算法题把我给整懵了 记录一下吧 算法题还是要多刷多刷! 解法一 排序 不赘述了 解法二 利用map集合 var majorrityElement=funct ...

  3. 记第三次面试经历——酷家乐

      这次的面试机会来的也很偶然,大概4月初的时候在 v2ex 论坛上看到了酷家乐的招聘信息,就照着邮箱发了自己的简历,当时也没有太在意.到了4月24号左右,收到了酷家乐的在线笔试邀约,在说这次面试前可 ...

  4. 酷家乐一面、二面、三面面经,中电海康一面

    9月25 号上午中电海康一面,29号通知9 号二面. 下午酷家乐技术一.二.三面,暂时没通知HR 面 酷家乐一面 1.html 标签语义化,优点与用处等? 答:漏了一个更利于 seo 2.如果有一行文 ...

  5. 酷家乐招聘 | 遇见offer之就要圆你的大厂梦

    简历投递入口 公司介绍:酷家乐/群核是全球领先的云设计软件平台. 资深前端开发工程师 岗位职责: 1.深入理解业务目标,主导业务组内的技术架构设计,高质量完成酷家乐云设计工具核心功能模块的设计和开发 ...

  6. 2017酷家乐秋招笔试题——后台开发

    楼主,昨天晚上做了酷家乐的笔试题,本来发来说是19:00-21:00两个小时,结果登入考试系统发现倒计时只有一个小时(坑!).不过题量很少,主要是选择题和简答题,简答题有一道是要编程的,当时内心太慌没 ...

  7. 常考面试算法题类型总结(来自知乎)

    作者:牛客网 链接:https://www.zhihu.com/question/24964987/answer/200681301 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  8. Java常见的面试算法题:实现两个线程交替打印1到100的数

    Java常见的面试算法题:实现两个线程交替打印1到100的数 思路: 这是涉及到多个线程打印的问题,一定会用到锁的(synchronized),故这就是一个多线程打印的典型案例. 代码实现: pack ...

  9. 常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可)

    常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可) 比较典型的题目,如下有: 题目一: 1.启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程 ...

最新文章

  1. javascript中parentNode,childNodes,children的应用详解
  2. 基于DirectX的游戏引擎-Xworld
  3. wsl使用可视化界面_通过 VcXsrv 在 WSL2 上使用图形化界面(xfce4)
  4. 第1章-导言-习题1.13-1.17
  5. liunxC下零碎知识点的总结
  6. 符号说明表怎么做_能看懂这些房屋施工图,说明你家装修没问题了
  7. 【BZOJ-3721】Final Bazarek 贪心
  8. java_web用户的自动登录模块的实现
  9. Spring AOP与拦截器的区别
  10. 在C#中使用SQL语句什么情况需要使用‘单引号’和“双引号”
  11. 城市道路5G智慧监控方案 让感知为安全护航
  12. 微信小程序云开发教程-墨刀原型工具入门
  13. 双绞线的制作方式详解
  14. 初次创建andriod项目出现的问题
  15. 如何求First集与Follow集(超详细)
  16. ubuntu终端英文乱码问题
  17. 为知笔记如何一键收藏微信文章?
  18. 观看加勒比海盗惊涛怪浪在线高清串流最快
  19. 为什么越来越多的企业选择短信接口平台?
  20. 【笔记】Android手机root的概念

热门文章

  1. Updating crates.io index 速度慢的解决办法
  2. 【STM32实战】机械臂快递分拣系统(一)——机械臂控制程序(下位机)编写
  3. 在windows上,用cmake 交叉编译arm程序
  4. 一人之下手游当前服务器注册已满,一人之下手游不能注册是怎么回事 一人之下手游不能注册原因详情...
  5. 充电桩 充电桩代码 直流双充充电桩 交流充电桩
  6. 【滤波】设计卡尔曼滤波器
  7. 什么是五档即成剩撤?
  8. keyshot分辨率多少合适_keyshot渲染格式(keyshot渲染好后,可以导入3DMAX吗?)
  9. 项目中期客户拜访随行小记
  10. 招聘区块链底层开发工程师(深圳)