设备中存有 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;}
};