给定一个数组 [a1b2c3d4] 转换为 [abcd1234]
约束:
- O(1) 空间
- O(n) 时间
这不是一个家庭作业问题,只是我遇到的一个有趣的问题。
以下是我能想到的一些解决方案,但在给定的约束下,没有任何解决方案可以做到这一点。
方法 1
*带 O(n) 内存 *
- 以递归方式将数组分为两部分。(继续除法,直到每个子问题的大小<= 2)
- 首先使用数组,在末尾对每个子问题进行排序。
- 合并子问题数组
方法 2
在 O(n log n) 时间内
- 对数组进行排序,字典顺序变为 1234abcd
- 反转阵列 4321dcba 的两半
- 反转整个字符串 abcd1234
方法 3
如果定义了数字范围
另外,如果情况是数字在特定范围内,那么我可以初始化一个int say track= 0;当我在数组中遇到一个数字时,设置适当的位,例如(1<<a[2])。1. 将字母表交换到数组 2 的前半部分。在轨道变量 3 中标记编号。稍后使用轨道填充数组的后半部分。
方法 4如果我们想删除整数范围的约束,我们可以将方法3与HashMap一起使用,但随后它将需要更多的内存。
想不出更好的方法来解决O(1)时间和O(n)空间中的一般问题。
这里的一般问题是指:
给定一个序列 x1y1x2y2x3y3....xnyn 其中 x1, x2 是字母 x1 < x2 <....< xn 和 y1y2...yn 是整数 。y1 < y2 <....< yn 将输出排列为 x1x2...xny1y2...yn
有什么建议吗?