图片说明

  • 第一种的解法是错误的
    class Solution {
      //虽然是道简单题 但是我切入点是O(N)时间 + O(1)空间
      //第一点:一开始是想用乘法到对应的位置[1,3,2]经过乘法除法处理后为[1,1,6]然后再得到[1,2(也就是6/3),3(也就是6/(6/3))] 
      //通过除法来得到原位置的数 发现有些数还没换过去导致结果错误 如
      //第二点:除法可能会导致1的出现 也就是无中生有 
      public static List<Integer> findDisappearedNumbers(int[] nums) {
          List<Integer> ls = new ArrayList<Integer>();
          for(int i = 0 ; i < nums.length ; i++) {
              nums[i] *= -1;
          }
          for(int i = 0 ; i < nums.length;i++){
              if(nums[i]<0){
                  if(Math.abs(nums[i]) != nums[Math.abs(nums[i])-1]) {
                      nums[Math.abs(nums[i]) - 1] = nums[i] * nums[Math.abs(nums[i]) - 1];
                      nums[i] /= nums[i];
                  }
              }
              else {
                  if ((nums[i] / (i + 1))!=nums[(nums[i] / (i + 1))-1]){
                      nums[nums[i] / (i + 1) - 1] = Math.abs(nums[i] / (i + 1) * nums[nums[i] / (i + 1) - 1]);
                  }
                  nums[i] /= (nums[i] / (i + 1));
              }
          }
          for(int i = 0 ; i < nums.length; i++){
              if(nums[i]-1!=i)
                  ls.add(i+1);
          }
          return ls;
      }
    }
  • 第二种原地修改 利用正负来差点对应的位置是否存在
    class Solution {
      public List<Integer> findDisappearedNumbers(int[] nums) {
          for (int i = 0; i < nums.length; i++) {
              if (nums[Math.abs(nums[i]) - 1] > 0) {
                  nums[Math.abs(nums[i]) - 1] *= -1;
              }
          }
          List<Integer> result = new LinkedList<Integer>();
          for (int i = 1; i <= nums.length; i++) {
              if (nums[i - 1] > 0) {
                  result.add(i);
              }
          }
          return result;
      }
    }