对不起,我不确定这个问题叫什么类型,我们只称它为“Remapping”,描述如下: 给定一个目标char数组,比如A [],你必须直接操作A.并且重新映射索引数组index []包含应重新赋值的索引。例如,给定A [] = {a,b,c,d,e},index [] = {2,4,3,0,1}。所以index [0] = 2,这意味着在操作之后,A [0]中的值必须是A [2],A [1]是A [4]等。 我知道如果我们有另一个数组,这个问题非常容易:
vector<char> myarr = vector<char>(A.size());
for (int i = 0; i < myarr.size(); i++)
myarr[i] = A[index[i]];
// myarr is the answer.
但如果我只允许O(1)空间怎么办呢? 感谢您分享您的意见。
哦顺便说一下,如果我有任何语法错误,请更正:“P
答案 0 :(得分:2)
可以通过将一对值与常量内存交换来解决问题,以便就地生成结果。虽然不是直接重复,但this question中讨论了该问题。
答案 1 :(得分:0)
你可以用两个变量来做;这是算法的草图:
for i=0:n
t_index = i
swap_index = index[t_index]
if index[i]!=-1:
while t_index!=swap_index
SWAP(index[t_index],index[swap_index])
index[t_index] = -1
t_index = getIndexOfValue(indexe, t_index)
这里没有涉及交换两个值的SWAP
和从数组中返回值的索引getIndexOfValue
的实现;但他们应该很容易理解
这里的想法是跟踪已交换的值的索引。在第一次交换之后,A [0]最终在A [2]中,所以你需要找出原始数组中索引0的值需要最终的位置,并将其交换到位置.....并且等等。
如果遇到麻烦,将它放在纸上可以帮助您全面了解