网易2016笔试(3)
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
返回:2
int quicksort(vector<int>&a,int i,int j){int k=a[i];while(i<j){while(j>i&&a[j]>=k)j--;if(i<j){a[i]=a[j];i++;}while(i<j&&a[i]<=k)i++;if(i<j){a[j]=a[i];j--;}}a[i]=k;return i;}int findKth(vector<int> a, int n, int K) {// write code hereint m=quicksort(a,0,n-1);quicksort(a,0,m-1);quicksort(a,m+1,n-1);return a[n-K];}
思路我觉得没问题,但总是得不到正确结果。而且例子给我的是49个数。没看出错误我就跟代码,第一步即刻发现我快排没排对啊。这样我就着重看快排。果然3个quicksort是什么鬼啊?应该是分治递归。这样代码改为如下即可。
int quicksort(vector<int>&a,int i,int j){int k=a[i];while(i<j){while(j>i&&a[j]>=k)j--;if(i<j){a[i]=a[j];i++;}while(i<j&&a[i]<=k)i++;if(i<j){a[j]=a[i];j--;}}a[i]=k;return i;}void quickMerge(vector<int>&A,int l,int j){if(l<j){int m=quicksort(A,l,j);quickMerge(A,l,m-1);quickMerge(A,m+1,j);}}int findKth(vector<int> a, int n, int K) {// write code herequickMerge(a,0,n-1);return a[n-K];}
这个复杂度当然是O(nlogn),但是在分治的基础上修改代码也可以采用如下方法。
int findKth(vector<int> a, int n, int K) {return quickfind(a, 0, n-1, K);}int quickfind(vector<int>& a, int left, int right, int k) {int i = left;int j = right;int mark = a[left];while (i < j) {while (i < j && a[j] >= mark)--j;if (i < j)a[i++] = a[j];while (i < j && a[i] <= mark)++i;if (i < j)a[j--] = a[i];}a[i] = mark;//哨兵右侧比他大的数字个数int big_num = right - i;//如果哨兵刚好是第K大的数if (k - big_num - 1 == 0)return mark;else if (k - big_num - 1 > 0) {//如果右侧数字个数不够K个,则从左侧找第k-big_num-1大的数return quickfind(a, left, i - 1, k - big_num - 1);} else {//如果右侧数字个数比K多,则在右侧找第K大的数return quickfind(a, i + 1, right, k);}}
这样的话复杂度肯定降低,因为只用递归调用一边,否则要完成排序需要调用两边。虽然浪费了很长时间,但找到了问题的关键我还是很开心的。
网易2016笔试(3)相关推荐
- 网易历届笔试面试题整理大全
整理了一下网易往届笔试面试题,希望对大家有帮助: 超级有用的面试题:Java常见面试题 常见算法面试题 数据库常见面试题 操作系统常见面试题 C/C++常见面试题 大数据常见面试 ...
- 网易2016游戏技术岗在线编程题(二)
题目来源:牛客网-网易2016年研发工程师编程题二. 1. 奖学金 小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg.每门课由平时成绩和考试成绩组成,满分为r.现在 ...
- 网易2016游戏技术岗在线编程题(一)
题目来源:牛客网-网易2016年研发工程师编程题. 1.小易的升级之路 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪 ...
- 网易2016研发工程师编程题--完全解析
前言 之前做公司的真题,碰到动态规划,还有一些数学性质的题目比较多一点.网易2016研发工程师编程题跟之前做的题目有很大的不同,不仅涉及到二叉树的编码,还涉及到图的广度遍历,最后还有一个快排.可以说这 ...
- 网易2016研发工程师笔试题
网易2016研发工程师笔试题 2015/12/9 11:25(网上收集整理的,参考答案在后面,若有错误请大神指出) 1. 执行指令find / -name "test.c",按ct ...
- 网易笔试 android,网易android笔试题目
网易android笔试题目 网易android笔试题目(1) 1.什么是ANR,如何规避? 2.描述Activity 生命周期 3.描述android Handler 工作机制 4.android s ...
- 网易2016实习研发笔试
小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. ...
- 网易2016招聘笔试升级之路Java代码
本文地址:http://blog.csdn.net/shanglianlm/article/details/72968583 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能 ...
- 网易笔试编程题java_2017年网易校招笔试JAVA研发编程题
为什么80%的码农都做不了架构师?>>> 尝试挑战了下网易2017校招的笔试编程题,共三题,AC第一题,第二题思考了很久勉强用一种low逼的方式完成,第三题没有完成,希望路过的ACM ...
最新文章
- Android学习笔记进阶十一图片动画播放(AnimationDrawable)
- Redis 击穿、穿透、雪崩产生原因以及解决思路
- CentOS LVM
- 线程安全: 互斥锁和自旋锁(10种)
- 【收藏】K8S部署minio对象存储
- mysql数据存储方式_数据存储在mysql的两种方式
- BIND_MISMATCH导致过多VERSION COUNT的问题
- linux 常用参数,Linux 常用命令及参数整理
- VMware发布面向未来的员工工作解决方案,满足分散办公需求
- vector使用中可能出现的一个陷阱
- 基于Pytorch的BERT-IDCNN-BILSTM-CRF中文实体识别实现
- eBPF for Windows开源项目
- 关于 SQLNET.AUTHENTICATION_SERVICES 验证方式的说明
- FCKeditor编辑器详解
- 用Ai制作立体logo
- gps面积测量 java_GPS面积距离测量
- Windows驱动程序开发 - 初识驱动
- 电脑接html线没反应,笔记本插上网线没反应怎么办【解决方法】
- 掌上生活显示服务器忙,掌上生活服务端
- Java计算每月工作天数
热门文章
- C++图书管理系统及相应文件的创建与输出
- Java设计模式 Design Pattern:包装模式 Decorator Pattern
- 电脑重新安装了有线网卡驱动,并且能上网,但网络连接图标有红叉怎么去掉
- KALI LINUX渗透测试学习笔记
- Windows、Unix、Mac不同操作系统的换行问题 回车符\r和换行符\n
- 计算机正朝两级方向发展即,当前计算机正朝两极方向发展,即()。A、专用机和通用机B、微型机和巨型机C、模拟机和数字机D、个人...
- 开源工单系统 python_运维工单--服务器申请工单
- 网管员必知:常用电脑密码破解(转)
- java微信公众号发送链接,100%好评!
- Python tkinter 保姆级超简易登陆界面教学