- 第一种的解法是错误的
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; } }