//解题思路
/*替换法(O(n),O(1))
数组存放原则:numbers[i] = i
遍历数组所有元素,交换不符合数组存放原则的元素:
    例如[2,3,1,0,2]
    遍历0位元素2:(交换0位元素2和2位元素1)->[1,3,2,0,2]
    遍历0位元素1:(交换0位元素1和1位元素3)->[3,1,2,0,2]
    遍历0位元素3:(交换0位元素3和3位元素0)->[0,1,2,3,2]
    依次遍历0、1、2、3位置元素,都符合存放原则numbers[i] = i,不做任何操作
    遍历末位元素2,此时末位元素2和2位元素2相等,出现了两次,即数字2位重复元素
 */
public int duplicate (int[] numbers) {
    for (int i = 0; i < numbers.length; i++) {
        if (numbers[i] != i){
            if (numbers[i] == numbers[numbers[i]]) return numbers[i];
            int temp = numbers[numbers[i]];
            numbers[numbers[i]] = numbers[i];
            numbers[i] = temp;
            i--;//遍历完0位元素以及交换完数字后,如果0位元素仍不符合数组存放原则:numbers[i] = i,那么还要重新遍历0位元素
        }
    }
    return -1;
}