1-2n的数存储在空间为n的数组中,找出出现两次的数字,时间复杂度O(n),空间复杂度O(1)
/*
奇数零次 偶数零次 0
奇数 一次 偶数 零次 -1
奇数 两次 偶数 零次 -2
奇数 零次 偶数 一次-3
奇数 一次 偶数 一次-4
奇数 两次 偶数 一次-5
奇数 零次 偶数 两次-6
奇数一次 偶数 两次-7
奇数两次 偶数两次-8
*/
public class Main {
public static void main(String[] args) {
int[] nums = {1, 3, 5, 15, 7, 8, 5, 3, 6, 15};
findNumber(nums, nums.length);
print(nums);
}
public static void findNumber(int[] nums, int length) {
for (int i = 0; i < length; ) {
if (nums[i] <= 0){
i++;
continue;
}
int index = nums[i] / 2;
boolean isOdd = (nums[i] % 2 == 0) ? false : true;
switch (nums[index]) {
case 0:
if (isOdd == true) {
nums[index] = -1;
} else {
nums[index] = -3;
}
break;
case -1:
if (isOdd == true) {
nums[index] = -2;
} else {
nums[index] = -4;
}
break;
case -2:
nums[index] = -3;
break;
case -3:
if (isOdd == true) {
nums[index] = -4;
} else {
nums[index] = -6;
}
break;
case -4:
if (isOdd == true) {
nums[index] = -5;
} else {
nums[index] = -7;
}
break;
case -5:
nums[index] = -6;
break;
case -6:
nums[index] = -7;
break;
case -7:
nums[index] = -8;
break;
default:
swap(nums, i, index);
if (isOdd) {
nums[index] = -1;
} else {
nums[index] = -3;
}
continue;
}
nums[i++]=0;
}
}
public static void swap(int[] nums, int i, int j){
int temp =nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
public static void print(int[] nums) {
for (int i = 0; i < nums.length; i++) {
if (nums[i] == -2) {
System.out.println(i * 2 + 1);
} else if (nums[i] == -6) {
System.out.println(i * 2);
} else if (nums[i] == -8) {
System.out.println(i * 2);
System.out.println(i * 2 + 1);
}
}
}
}