笔试算法题(17):奇偶数分置数组前后段 & 反序访问链表
2014-05-21 09:20
274 查看
出题:输入一个数组,要求通过交换操作将奇数索引的元素调整到数组前半部分,偶数索引的元素调整到数组后半部分;
分析:
当然如果没有额外要求的话很容易实现,最好使用In-Place的实现策略;考虑插入排序的策略,不过这里的判断条件是遇到第一个奇数的时候才停止。时间复杂度为O(N^2);
另外可以使用快速排序策略,使用两个指针进行双向扫描,左指针一旦遇到偶数则停止,右指针一旦遇到奇数则停止,然后交换左右指针索引的元素,知道左右指针交叉。时间复杂度为O(N)。如果题目要求在一个序列中按照某标准将序列划分成几个部分,快速排序的思路都可以使用;
快速排序的思路可用于多种问题,只要是需要按照某种标准将一个序列划分成两个或者更多的部分,都可以使用快速排序的策略
解题:
出题:输入一个链表的头结点,要求反序输出每个结点的值
分析:典型的递归实现,系统栈结构是为程序员免费提供的最好的数据结构
解题:
分析:
当然如果没有额外要求的话很容易实现,最好使用In-Place的实现策略;考虑插入排序的策略,不过这里的判断条件是遇到第一个奇数的时候才停止。时间复杂度为O(N^2);
另外可以使用快速排序策略,使用两个指针进行双向扫描,左指针一旦遇到偶数则停止,右指针一旦遇到奇数则停止,然后交换左右指针索引的元素,知道左右指针交叉。时间复杂度为O(N)。如果题目要求在一个序列中按照某标准将序列划分成几个部分,快速排序的思路都可以使用;
快速排序的思路可用于多种问题,只要是需要按照某种标准将一个序列划分成两个或者更多的部分,都可以使用快速排序的策略
解题:
/** * 从数组第三项开始,假设左边的数组都已经是奇数项在前,偶数项在后 * 然后将当前索引项插入已经排好序的左序列中,一旦遇到奇数项则插入到 * 其右边的偶数项,其他项顺次往右移,跟插入排序类似 * 遍历数组的时候跳过偶数项,可以加速排序时间 * */ void OddEvenInsert(int *array, int length) { int j, temp; if(length <= 2) return; for(int i=2; i<length;i+=2) { temp=array[i]; j=i-1; while(true) { if(array[j] %2 == 0) { array[j+1]=array[j]; j--; } else { break; } } array[j+1]=temp; } } void OddEvenQuick(int *array, int i, int j) { int *left=array+i; int *right=array+j; int temp; while(true) { while(*left%2 != 0) left++; while(*right%2 != 1) right--; if(left>right) break; temp=*left; *left=*right; *right=temp; left++; right--; } } int main() { int array[]={1,2,3,4,5,6,7,8,9}; OddEvenInsert(array, 9); for(int i=0;i<9;i++) { printf("%d, ",array[i]); } return 0; }
出题:输入一个链表的头结点,要求反序输出每个结点的值
分析:典型的递归实现,系统栈结构是为程序员免费提供的最好的数据结构
解题:
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=2; Node* a2=new Node(); a2->v=4;a1->next=a2; Node* a3=new Node(); a3->v=6;a2->next=a3; Node* a4=new Node(); a4->v=8;a3->next=a4; Node* a5=new Node(); a5->v=10;a4->next=a5; Node* a6=new Node(); a6->v=11;a5->next=a6; a6->next=NULL; reversePrint(a1); return 0; }
相关文章推荐
- 笔试算法题(28):删除乱序链表中的重复项 & 找出已经排好序的两个数组中的相同项
- 笔试算法题(07):还原后序遍历数组 & 半翻转英文句段
- 笔试算法题(26):顺时针打印矩阵 & 求数组中数对差的最大值
- 笔试算法题(13):反转链表 & 左旋转字符串
- 算法————笔试内容-->链表(一)
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
- 笔试算法题(22):二分法求旋转数组最小值 & 骰子值概率
- 笔试算法题(40):后缀数组 & 后缀树(Suffix Array & Suffix Tree)
- 笔试算法题(05):转换BST为双向链表 & 查找栈中的最小元素
- 笔试算法题(25):复制拥有多个指针的链表 & 判断二元树B是否为A的子树
- 笔试算法题(31):将有序数组转换成BST表示 & 线段树的应用
- 笔试算法题(32):归并算法求逆序对 & 将数组元素转换为数组中剩下的其他元素的乘积
- 算法————笔试内容--->链表(二)
- 笔试算法题(29):判断元素范围1到N的数组是否有重复数字 & 计算整数的7倍
- 笔试算法题(27):判断单向链表是否有环并找出环入口节点 & 判断两棵二元树是否相等
- 笔试算法题(19):判断两条单向链表的公共节点 & 字符集删除函数
- 笔试算法题(06):最大连续子数组和 & 二叉树路径和值
- HDU 5444 Elven Postman (排序二叉树 访问路径 数组&&链表实现)
- 将数组的奇数移到前面偶数到后面&&输出链表的倒数第k个结点
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素