设备中存有 n
个文件,文件 id
记于数组 documents
。若文件 id
相同,则定义为该文件存在副本。请返回任一存在副本的文件 id
。
示例 1:
输入:documents = [2, 5, 3, 0, 5, 0]
输出:0 或 5
提示:
0 ≤ documents[i] ≤ n-1
2 <= n <= 100000
思路:
1、注意提示的第一条0<=documents[i]<=n-1。
2、边排序边查找存在副本的文件id。
3、排序过程,由于文件的id大于0小于文件个数减1,因此我们可以通过让文件id等于数组下标的方法来进行排序。
4、当i==documents[i]时,表明该元素已经有序了,比如0的位置元素值就是0,这种情况继续向后进行比较。
5、当documents[i]==documents[documents[i]]时,即有两个相同的id,存在副本,此时直接返回此id即可。
6、若不相等,交换两个元素的位置,操作过后我们即可让documents[3]放到下标和值相等的位置。
7、继续循环。
代码实现:
class Solution {
public:
int findRepeatDocument(vector<int>& documents) {
int size = documents.size();
int i = 0;
while(i < size)
{
if(i == documents[i]) //表示此元素已经有序。
{
++i;
continue;
}
else if(documents[i] == documents[documents[i]]) //表明此id存在副本
return documents[i];
else //表明不相等,我们让documents[i]放到值与下标相等的位置
{
int tmp = documents[i];
documents[i] = documents[documents[i]];
documents[tmp] = tmp;
}
}
return -1;
}
};