题目一:
标准答案:
总结:
- 如果考虑时间复杂度:
public class Solution {
public int singleNumber(int[] nums){
int single = 0;
for (int num: nums){
single = single ^ num;
}
return single;
}
public static void main(String[] args){
int[] test_array = {4,1,2,1,2};
Solution s = new Solution();
int single_num = s.singleNumber(test_array);
System.out.println(single_num);
}
}
- 如果不考虑时间复杂度和额外空间要求:
import java.util.ArrayList;
public class Solution2 {
public int singleNumber(int[] nums){
ArrayList<Integer> num_array = new ArrayList<>();
for (int num: nums){
if (num_array.contains(num) == true){
num_array.remove(num_array.indexOf(num));
}else {
num_array.add(num);
}
}
return num_array.get(0);
}
public static void main(String[] args){
int[] test_array = {4,1,2,1,2,3,5,3,6,5,6};
Solution2 s = new Solution2();
int single_num = s.singleNumber(test_array);
System.out.println(single_num);
}
}
题目二:
很类似的一道题,但是要求不同:
重点在于时间复杂度要求O(log n),因此不能全部遍历
方法:二分搜索
四种情况:
标准答案:
public class Solution3 {
public int singleNumber(int[] nums){
int lo = 0;
int hi = nums.length - 1;
while (lo < hi){
int mid = lo + (hi - lo)/2;
boolean havesAreEven = (hi - mid) % 2 == 0;
if (nums[mid+1]==nums[mid]){
if (havesAreEven) {
lo = mid + 2;
}else {
hi = mid - 1;
}
}else if (nums[mid-1]==nums[mid]){
if(havesAreEven){
hi = mid - 2;
}else {
lo = mid + 1;
}
}else {
return nums[mid];
}
}
return nums[lo];
}
public static void main(String[] args){
int[] test_array = {1,1,4,4,5,5,6,6,8,9,9};
Solution3 s = new Solution3();
int single_num = s.singleNumber(test_array);
System.out.println(single_num);
}
}