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. 网络流24题(2) P4014 分配问题
  2. VS打开文件,解决方案资源管理器自动定位到文件位置
  3. 2019-03-14-算法-进化(移动零)
  4. Javascript实现合并单元格
  5. First C program
  6. 兼容ie6css怎么设置,CSS样式兼容IE6、IE7、IE8、FF火狐浏览器的方法
  7. 满满的一整篇,全是 JVM 核心知识点!
  8. 云上“超算中心” 阿里云推出弹性高性能计算平台E-HPC
  9. git21天打卡day21-解决合并冲突
  10. 一万块内工作站型计算机配置,1.5万元i7-7700K用于图形工作站高端电脑配置推荐...
  11. C 小鑫の日常系列故事(七)——小纸条 SDUT
  12. 用python中django创建网页_使用python Django做网页
  13. cad直线和圆弧倒角不相切_CAD倒角技巧
  14. HTML5用于定义一篇日志,[网页设计]HTML5之新增的元素
  15. 神经网络实现---SSD
  16. 锁相环设计与MATLAB仿真
  17. 别让用户发呆—设计中的防呆策略
  18. 《Ext JS 6.2实战》节选——迁移管理模版
  19. 长期更新收藏的函数——那些年我们跪在键盘上欣赏过的函数
  20. java bean to bean,Bean_to_Bean 赋值完整解决(可用在实际开发)

热门文章

  1. windows下断开文件共享连接的方法
  2. Typecho 免费“魔改官方”模板
  3. vmware16.2虚拟机声音失真卡顿,噪音,暴音,滋拉音解决方法
  4. PartMaker 编程加工基础到精通视频教程 2018资料教程
  5. [Game] Happiness 破解 StarForce 认证
  6. python显示汉字_python如何显示中文字体
  7. 黑月教主去水印软件_去视频水印的软件有什么?这个多功能转换器
  8. php代码生成器软件_PHPCMS代码生成器
  9. pyspark开发趣味题1-求共同好友
  10. 如何有效禁止qDebug的输出?qDebug().nospace()和noquote()的作用是什么?