给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
    示例 1:
    输入: nums = [1,1,2,3,3,4,4,8,8]
    输出: 2

    示例 2:

    输入: nums = [3,3,7,7,10,11,11]
    输出: 10

    1. /**
    2. * 思路1:暴力法求解
    3. * 直接遍历整个数组,对比它的下一个元素,如果找到了相同的,说明不是,如果不相同,说明就是这个元素
    4. * 但是,这种做法要注意,移动指针的时候,需要步长按照2来移动。
    5. *
    6. * 思路2:二分查找
    7. * (1)设置3个指针,left=0,right=length-1,mid
    8. * (2)当找到中间位置的时候,如果左边元素等于mid位置元素,那么就继续从右边找
    9. * (3)如果右边元素等于mid位置元素,那么就继续从左边找,如果没有,直接返回
    10. * (4)重点:在找到左右两侧是否有相同元素之后,
    11. * 要判断一下这两个元素左右两边哪边是剩下的数组是奇数个,就从哪边继续找。
    12. */
    13. int len = nums.length-1;
    14. if (len == 0) {
    15. return nums[0];
    16. }
    17. int left = 0,right = len;
    18. while(left < right){
    19. int mid = left + (right-left) / 2;
    20. // 判断左右两边的元素哪个是包含单个元素的(元素个数为奇数个)
    21. // 判断mid的大小
    22. if (nums[mid-1] == nums[mid]){
    23. if ((mid - 1) % 2 == 0) {
    24. left = mid + 1;
    25. } else {
    26. right = mid - 2;
    27. }
    28. }else if (nums[mid+1] == nums[mid]){
    29. // 右边是奇数个
    30. if(mid % 2 == 0){
    31. left = mid + 2;
    32. }else {
    33. right = mid - 1;
    34. }
    35. }else {
    36. return nums[mid];
    37. }
    38. }
    39. return nums[left];
    40. }
    41. }