2012年UC的一道笔试题——空间时间复杂度限制下的数字排序
2012-10-18 10:01
162 查看
2012年UC的一道笔试题
在空间复杂度O(1),时间复杂度O(n)下,置换数组
a1, a2, ..., an, b1, b2, ..., bn
置换后
a1, b1, a2, b2,..., an, bn
关于此题,一般我们的做法都是重新构造一个数组来进行操作,但与题中描述的空间复杂度O(1)不符,为了达到空间复杂度O(1),就必须充分利用原数组的空间,因而我使用的方法是迭代置换,具体代码如下:
在空间复杂度O(1),时间复杂度O(n)下,置换数组
a1, a2, ..., an, b1, b2, ..., bn
置换后
a1, b1, a2, b2,..., an, bn
关于此题,一般我们的做法都是重新构造一个数组来进行操作,但与题中描述的空间复杂度O(1)不符,为了达到空间复杂度O(1),就必须充分利用原数组的空间,因而我使用的方法是迭代置换,具体代码如下:
#include <stdio.h> #define N 10 int a[2 * N + 1]; int temp = 0, flag = 1; void IterSwap(int index) { int t = index; if ((t % 2 && (t + 1) / 2 == a[t]) || (!(t % 2) && t / 2 + N == a[t])) { flag = 1; return; } // 第一次迭代,暂存变量 if (flag) { temp = index; flag = 0; } if (index % 2) { t = (index + 1) / 2; if ((t % 2 && (t + 1) / 2 == a[t]) || (!(t % 2) && t / 2 + N == a[t])) { a[index] = temp; flag = 1; return; } } else { t = index / 2 + N; if ((t % 2 && (t + 1) / 2 == a[t]) || (!(t % 2) && t / 2 + N == a[t])) { a[index] = temp; flag = 1; return; } } a[index] = a[t]; IterSwap(t); } int main() { int i; for (i=1; i<=2 * N; ++i) a[i] = i; i = 2 * N - 1; for (i = 2; i < 2 * N; ++i) IterSwap(i); for (i=1; i<=2 * N; ++i) printf("%d ", a[i]); printf("\n"); return 0; }
相关文章推荐
- 动态规划算法(微软一面笔试题:股票交易,O(N)时间复杂度O(1)空间复杂度)
- 百度笔试:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 要求:空间复杂度O(1),时间复杂度为O(n)
- 每天一道LeetCode-----找到序列中第一个没有出现的正整数,要求时间复杂度是O(n),空间复杂度是O(1)
- LeetCode | 442. Find All Duplicates in an Array 限制时间复杂度O(n)空间复杂度O(1)的题
- 一道时间复杂度为O(N)空间复杂度为O(1)的排序问题
- 常见排序的时间复杂度和空间复杂度
- 排序算法之 基数排序 及其时间复杂度和空间复杂度
- [C++]时间复杂度&空间复杂度
- 时间复杂度&空间复杂度
- java 快速排序 时间复杂度 空间复杂度 稳定性
- 算法-时间复杂度和空间复杂度
- 作业3 算法时间复杂度和空间复杂度
- 算法之时间复杂度和空间复杂度
- 数据结构排序问题---堆排序及各种排序时间空间复杂度
- 算法的时间复杂度和空间复杂度
- 数据结构 时间复杂度 空间复杂度 一看就懂版本
- 算法的时间复杂度和空间复杂度-总结
- 时间复杂度和空间复杂度详解
- 算法第一弹:时间复杂度和空间复杂度
- 算法的时间复杂度和空间复杂度-总结