29、酷家乐面试算法题
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。
算法流程:
- 初始化: 票数统计 votes = 0 , 要找的数字记为x;
- 循环: 遍历数组 nums 中的每个数字 num ;
- 当 票数 votes 等于 0 ,则假设当前数字 num 是众数;
- 当 num = x 时,票数 votes 自增 1 ;当 num != x 时,票数 votes 自减 1 ;
- 返回值: 返回 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、酷家乐面试算法题相关推荐
- 从酷家乐面试官到收获阿里Offer过程中的一些心得与思考
本文来自读者投稿,作者:绯凡,跟大家聊聊从酷家乐面试官到收获阿里 Offer 过程中的一些心得与思考,希望对大家的格局和理解有些帮助 https://juejin.im/post/5e842e6c51 ...
- 酷家乐前端开发工程师一面
写在前面 周五面试酷家乐 面试官上来直接五道算法题把我给整懵了 记录一下吧 算法题还是要多刷多刷! 解法一 排序 不赘述了 解法二 利用map集合 var majorrityElement=funct ...
- 记第三次面试经历——酷家乐
这次的面试机会来的也很偶然,大概4月初的时候在 v2ex 论坛上看到了酷家乐的招聘信息,就照着邮箱发了自己的简历,当时也没有太在意.到了4月24号左右,收到了酷家乐的在线笔试邀约,在说这次面试前可 ...
- 酷家乐一面、二面、三面面经,中电海康一面
9月25 号上午中电海康一面,29号通知9 号二面. 下午酷家乐技术一.二.三面,暂时没通知HR 面 酷家乐一面 1.html 标签语义化,优点与用处等? 答:漏了一个更利于 seo 2.如果有一行文 ...
- 酷家乐招聘 | 遇见offer之就要圆你的大厂梦
简历投递入口 公司介绍:酷家乐/群核是全球领先的云设计软件平台. 资深前端开发工程师 岗位职责: 1.深入理解业务目标,主导业务组内的技术架构设计,高质量完成酷家乐云设计工具核心功能模块的设计和开发 ...
- 2017酷家乐秋招笔试题——后台开发
楼主,昨天晚上做了酷家乐的笔试题,本来发来说是19:00-21:00两个小时,结果登入考试系统发现倒计时只有一个小时(坑!).不过题量很少,主要是选择题和简答题,简答题有一道是要编程的,当时内心太慌没 ...
- 常考面试算法题类型总结(来自知乎)
作者:牛客网 链接:https://www.zhihu.com/question/24964987/answer/200681301 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...
- Java常见的面试算法题:实现两个线程交替打印1到100的数
Java常见的面试算法题:实现两个线程交替打印1到100的数 思路: 这是涉及到多个线程打印的问题,一定会用到锁的(synchronized),故这就是一个多线程打印的典型案例. 代码实现: pack ...
- 常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可)
常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可) 比较典型的题目,如下有: 题目一: 1.启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程 ...
最新文章
- javascript中parentNode,childNodes,children的应用详解
- 基于DirectX的游戏引擎-Xworld
- wsl使用可视化界面_通过 VcXsrv 在 WSL2 上使用图形化界面(xfce4)
- 第1章-导言-习题1.13-1.17
- liunxC下零碎知识点的总结
- 符号说明表怎么做_能看懂这些房屋施工图,说明你家装修没问题了
- 【BZOJ-3721】Final Bazarek 贪心
- java_web用户的自动登录模块的实现
- Spring AOP与拦截器的区别
- 在C#中使用SQL语句什么情况需要使用‘单引号’和“双引号”
- 城市道路5G智慧监控方案 让感知为安全护航
- 微信小程序云开发教程-墨刀原型工具入门
- 双绞线的制作方式详解
- 初次创建andriod项目出现的问题
- 如何求First集与Follow集(超详细)
- ubuntu终端英文乱码问题
- 为知笔记如何一键收藏微信文章?
- 观看加勒比海盗惊涛怪浪在线高清串流最快
- 为什么越来越多的企业选择短信接口平台?
- 【笔记】Android手机root的概念
热门文章
- Updating crates.io index 速度慢的解决办法
- 【STM32实战】机械臂快递分拣系统(一)——机械臂控制程序(下位机)编写
- 在windows上,用cmake 交叉编译arm程序
- 一人之下手游当前服务器注册已满,一人之下手游不能注册是怎么回事 一人之下手游不能注册原因详情...
- 充电桩 充电桩代码 直流双充充电桩 交流充电桩
- 【滤波】设计卡尔曼滤波器
- 什么是五档即成剩撤?
- keyshot分辨率多少合适_keyshot渲染格式(keyshot渲染好后,可以导入3DMAX吗?)
- 项目中期客户拜访随行小记
- 招聘区块链底层开发工程师(深圳)