笔试算法题(17):奇偶数分置数组前后段 & 反序访问链表
出题:输入一个数组,要求通过交换操作将奇数索引的元素调整到数组前半部分,偶数索引的元素调整到数组后半部分;
分析:
- 当然如果没有额外要求的话很容易实现,最好使用In-Place的实现策略;考虑插入排序的策略,不过这里的判断条件是遇到第一个奇数的时候才停止。时间复杂度为O(N^2);
- 另外可以使用快速排序策略,使用两个指针进行双向扫描,左指针一旦遇到偶数则停止,右指针一旦遇到奇数则停止,然后交换左右指针索引的元素,知道左右指针交叉。时间复杂度为O(N)。如果题目要求在一个序列中按照某标准将序列划分成几个部分,快速排序的思路都可以使用;
- 快速排序的思路可用于多种问题,只要是需要按照某种标准将一个序列划分成两个或者更多的部分,都可以使用快速排序的策略
解题:
/**
* 从数组第三项开始,假设左边的数组都已经是奇数项在前,偶数项在后
* 然后将当前索引项插入已经排好序的左序列中,一旦遇到奇数项则插入到
* 其右边的偶数项,其他项顺次往右移,跟插入排序类似
* 遍历数组的时候跳过偶数项,可以加速排序时间
* */
void OddEvenInsert(int *array, int length) {
int j, temp;
if(length <= ) return;
for(int i=; i<length;i+=) {
temp=array[i];
j=i-;
while(true) {
if(array[j] % == ) {
array[j+]=array[j];
j--;
} else {
break;
}
}
array[j+]=temp;
}
} void OddEvenQuick(int *array, int i, int j) {
int *left=array+i;
int *right=array+j; int temp;
while(true) {
while(*left% != ) left++;
while(*right% != ) right--;
if(left>right) break; temp=*left;
*left=*right;
*right=temp; left++;
right--;
}
} int main() {
int array[]={,,,,,,,,};
OddEvenInsert(array, );
for(int i=;i<;i++) {
printf("%d, ",array[i]);
}
return ;
}
出题:输入一个链表的头结点,要求反序输出每个结点的值
分析:典型的递归实现,系统栈结构是为程序员免费提供的最好的数据结构
解题:
struct Node {
int v;
Node *next;
}; void reversePrint(Node *current) {
if(current->next != NULL)
reversePrint(current->next);
printf("%d, ",current->v);
} int main() {
Node* a1=new Node(); a1->v=;
Node* a2=new Node(); a2->v=;a1->next=a2;
Node* a3=new Node(); a3->v=;a2->next=a3;
Node* a4=new Node(); a4->v=;a3->next=a4;
Node* a5=new Node(); a5->v=;a4->next=a5;
Node* a6=new Node(); a6->v=;a5->next=a6; a6->next=NULL;
reversePrint(a1);
return ;
}
笔试算法题(17):奇偶数分置数组前后段 & 反序访问链表的更多相关文章
- 笔试算法题(40):后缀数组 & 后缀树(Suffix Array & Suffix Tree)
议题:后缀数组(Suffix Array) 分析: 后缀树和后缀数组都是处理字符串的有效工具,前者较为常见,但后者更容易编程实现,空间耗用更少:后缀数组可用于解决最长公共子串问题,多模式匹配问题,最长 ...
- 笔试算法题(20):寻找丑数 & 打印1到N位的所有的数
出题:将只包含2,3,5的因子的数称为丑数(Ugly Number),要求找到前面1500个丑数: 分析: 解法1:依次判断从1开始的每一个整数,2,3,5是因子则整数必须可以被他们其中的一个整除,如 ...
- 前端如何应对笔试算法题?(用node编程)
用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...
- 笔试算法题(54):快速排序实现之单向扫描、双向扫描(single-direction scanning, bidirectional scanning of Quick Sort)
议题:快速排序实现之一(单向遍历) 分析: 算法原理:主要由两部分组成,一部分是递归部分QuickSort,它将调用partition进行划分,并取得划分元素P,然后分别对P之前的部分和P 之后的部分 ...
- 笔试算法题(22):二分法求旋转数组最小值 & 骰子值概率
出题:将一个数组最开始的k个(K小于数组大小N)元素照搬到数组末尾,我们称之为数组的旋转:现在有一个已经排序的数组的一个旋转,要求输出旋转数组中的最小元素,且时间复杂度小于O(N): 分析: 时间复杂 ...
- php笔试算法题:顺时针打印矩阵坐标-蛇形算法
这几天参加面试,本来笔试比较简单,但是在面试的时候,技术面试官说让我现场写一个算法,顺时针打印矩阵的坐标,如图所示 顺序为,0,1,2,3,4,9,14,19,24,23,22,21,20,15,10 ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)
议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...
- 笔试算法题(52):简介 - KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm)
议题:KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm) 分析: KMP算法用于在一个主串中找出特定的字符或者模式串.现在假设主串为长度n的数组T ...
随机推荐
- javascript判断页面是否在移动设备上打开
var ua = navigator.userAgent; var ipad = ua.match(/(iPad).*OS\s([\d_]+)/), isIphone =!ipad && ...
- Ruby模块与类
Ruby是单一继承,一个类只能有一个直接的母类 Mix-in 模式来处理复合需求 多重包含: 由下往上回溯,重复的只看最上方的 换句话说,程序由上往下执行,由具体到抽象,第二次发现同一个模块 ...
- 【洛谷4769】[NOI2018] 冒泡排序(动态规划_组合数学)
题目: 洛谷 4769 博客页面左下角的嘴嘴瓜封神之战中的题目 分析: 一个排列交换次数为 \(\frac{1}{2}\sum_{i=1}^{n}|i-p_i|\) 的充要条件是这个排列不存在长度为 ...
- That Nice Euler Circuit UVALive - 3263 || 欧拉公式
欧拉定理: 简单多面体的顶点数V.棱数E及面数F间有关系有著名的欧拉公式:V-E+F=2. 设G为任意的连通的平面图,则v-e+f=2,v是G的顶点数,e是G的边数,f是G的面数.(引) 证明(?) ...
- Linux环境下ZooKeeper集群环境搭建关键步骤
ZooKeeper版本:zookeeper-3.4.9 ZooKeeper节点:3个节点 以下为Linux环境下ZooKeeper集群环境搭建关键步骤: 前提条件:已完成在Linux环境中安装JDK并 ...
- Optimizing Downloads for Efficient Network Access
Optimizing Downloads for Efficient Network Access Previous Next 1.This lesson teaches you to Unders ...
- Codeforces Beta Round #98 (Div. 2)(A-E)
A #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- Netflix正式开源其API网关Zuul 2--转
微信公众号:聊聊架构 5 月 21 日,Netflix 在其官方博客上宣布正式开源微服务网关组件 Zuul 2.Netflix 公司是微服务界的楷模,他们有大规模生产级微服务的成功应用案例,也开源了相 ...
- WebForm 开发方式,简单使用
ASP开发方式 格式 <% %> C#代码可以写在里面 <%= %> 往外输出一个值,可以放一个变量,一个方法(这个方法是有返回值的直接打印到界面上去) <%@ %& ...
- 【开源】基于EF6+MVC5+API2+Easyui1.4.5+Easyui管理模板开发的管理系统
经过近一步完善调整,现将本系统源码正式开放,定名为:EasyuiAdminFramework,另外EasyuiAdminTemplate及EasyuiFlatTheme也一并开源 项目主页:http: ...