一道有序洗牌的笔试题,阿里\UC等都用过
题目:给定一个已经降序排好序的正数数组,要求按「最小、最大、次小、次大……」的顺序重新排序。期望的时间复杂度为O(n),空间复杂度为O(1),即不能申请额外的数组。
例如:输入[7,6,5,4,3,2,1],输出[1,7,2,6,3,5,4]。
分析:该题有多种方法可以解答,在这里给出一个不超过应届毕业生知识范围的写法。
private static void ReCardsSortInPlace(int[] array)
{
if (array == null) throw new ArgumentNullException();
if (array.Length < 2) return;
if (array.Length == 2)
{
int temp = array[0];
array[0] = array[1];
array[1] = temp;
return;
}
//因为循环不变式的初始条件是N>=3所以,当N<=2时只能靠手调了。
int swapTemp, swapTemp1, length = array.Length - 1, right = length;
int k = right;
int rightCount = right - 1;
//循环进入条件,N>=3,结束条件,从数组右侧开始,当调整的位置的数量大于N/3时
while ((2 * (length - right + 1)) <= right)
{
//循环初始条件
k = right;
swapTemp1 = array[right];
do
{
k = ReIndex(k, length);
swapTemp = array[k];
array[k] = swapTemp1;
swapTemp1 = swapTemp; } while (right != k);
//由于数组是递减的,所以调整过的数组一定会满足以下条件
while (array[rightCount] > array[ReIndex(rightCount, length)])
{
rightCount--;
}
right = rightCount;//将未调整的循环的初始值重新赋予right变量
rightCount = right - 1;
}
}
private static int ReIndex(int index, int length)
{
if (index <= length / 2)
return (2 * index + 1 > length) ? 2 * index : (2 * index + 1);
else
return (2 * (length - index));
}
一道有序洗牌的笔试题,阿里\UC等都用过的更多相关文章
- 一道CVTE前端二面笔试题
题目:给你一个数组,输出数组中出现次数第n多的数字; 比如:[1,1,1,2,2,2,3,3,4,4,5,5,6,6,7]; 1---3次 2---3次 3---2次 4---2次 5---2次 6- ...
- [转]完美洗牌(Perfect Shuffle)问题
[转]原博文地址:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.09.md ...
- Android开发面试经——3.常见Java基础笔试题
Android开发(29) 版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...
- 一道简单的 Java 笔试题,但值得很多人反思!
前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问什么深入的技术问题,只问一些广泛的.基础的.我只要 ...
- 【Android】一道Android OpenGL笔试题
一道Android OpenGL笔试题 SkySeraph May. 5th 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sky ...
- Java中有关构造函数的一道笔试题解析
Java中有关构造函数的一道笔试题解析 1.详细题目例如以下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与c ...
- 一道笔试题来理顺Java中的值传递和引用传递
题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...
- 一道笔试题和UML思想 ~
一句软件工程界的名言,让我想起了一个和一道笔试题有关的故事.希望更多的人了解 UML 背后的思想比他的语法更重要,是笔者写作本文的一点小愿望. 一.从一句软件工程名言说起 对很多事情的处理上,东西方都 ...
- 一道灵活的css笔试题
今天在网上看到一css笔试题,乍一看很简单,实则内部暗藏玄机,题目大概是:九宫格,每格长宽50px,边框宽度5px,鼠标经过边框变红,效果如下: 鼠标路过时: 以下是代码(如有不足之处望多加指正) & ...
随机推荐
- out与ref修饰符
out修饰符 定义 作用 使用注意 总结 定义 out意为output,所以被out修饰的参数叫做输出参数. 通过使用out修饰的参数,方法可以返回对应参数的值 作用 先看一个例子 定义变量: ...
- 表A中一条记录的两个字段都对应于表B的同一个字段 如何查询?SQL, thinkphp[5]
表 A=approval_order, B=admin, 表A中technician_username, salesman_username 都是id号,中文名保存在admin表的nickname ...
- ref:Struts2 命令执行系列回顾
ref:http://www.zerokeeper.com/vul-analysis/struts2-command-execution-series-review.html Struts2 命令执行 ...
- BASE64Decoder BASE64Encoder jar包问题
操作 对项目右击--->build path--->configure build path---> 选中默认jre OK,操作完毕, import sun.misc.BASE64D ...
- 注入AspectJ切面
为什么要用AspectJ:AspectJ提供了Spring AOP很多不能实现的多种切点类型(比如属性,构造方法切入,由于不能实现构造方法的切入spring aop就不能实现对象创建过程的通知) As ...
- NOIP2017 D2T3列队
这题我改了三天,考场上部分分暴力拿了50,考完试发现与正解很接近只是没写出来. 对于每一行和最后一列建n+1颗线段树,维护前缀和. 复杂度qlogn 假如你移动一个坐标为(x,y)的人,你要将第x行线 ...
- PHP配置文件经典漏洞
phithon师父在小蜜圈里放了一个经典的配置文件写入问题漏洞. <?phpif(!isset($_GET['option'])) die();$str = addslashes($_GET[' ...
- bzoj 2434 ac自动机
ac自动机中,如果以trie中的节点为节点,(fail[i],i)为边,可以建立一颗树,该树有如下特点:“节点u是节点v的祖先 当且仅当 u代表的字符串是v代表的字符串的一个后缀”.(u代表的字符串是 ...
- bzoj1004 purfer 序列
之前没不知道这个数列. 一个purfer序列与一棵树一一对应. 长度为n的purfer的集合: A = { s | s is a sequence and a∈[1,len(s)+2] 一个直接的结论 ...
- 11.m进制转十进制
Strlen是字符串有多长就是多长,包括所有的元素和\0这个结束符 题目描述 Description 将m进制数n转化成一个十进制数 m<=16 题目保证转换后的十进制数<=100 输入描 ...