剑指Offer-51

xiaoxiao2021-02-28  145

题目:

在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

实现

public class Solution51 { //方法一 遍历数组,将数组放入hashmap,键为数字,值为出现的次数 public void findDuplicateNums1(int[] nums){ if(nums==null || nums.length<1){ System.out.print("数组为空"); return; } for(int i=0;i<nums.length;i++) { if(nums[i]<0 || nums[i]>(nums.length-1)){ System.out.print("数组不符合要求"); return; } } Map<Integer,Integer> dic = new HashMap(); int count =0; for(int i=0;i<nums.length;i++){ if(dic.containsKey(nums[i])){ count = dic.get(nums[i])+1; dic.put(nums[i],count); } else { dic.put(nums[i],1); } } for(int i=0;i<nums.length;i++){ if((int)dic.get(nums[i])>1){ System.out.println(nums[i]); return; } } } //方法二 不用额外空间,调整数组中数的顺序 public void findDuplicateNums2(int[] nums) { if (nums == null || nums.length < 1) { System.out.print("数组为空"); return; } for(int i=0;i<nums.length;i++) { if(nums[i]<0 || nums[i]>(nums.length-1)){ System.out.print("数组不符合要求"); return; } } for(int i=0;i<nums.length;i++){ //若有重复的,则一定会有nums[i]!=i,不断交换,一定 有 nums[i]==nums[nums[i]] //若没有重复,则一定最终 每个位置 nums[i]==i while (nums[i]!=i){ if(nums[i]==nums[nums[i]]){ System.out.print(nums[i]); return; } int temp =nums[i]; nums[i] = nums[nums[i]]; nums[nums[i]]=temp; } } } public static void main(String[] args){ int[] test = {2,3,1,0,2,5,3}; Solution51 s = new Solution51(); s.findDuplicateNums1(test); s.findDuplicateNums2(test); } }
转载请注明原文地址: https://www.6miu.com/read-26063.html

最新回复(0)