zoukankan      html  css  js  c++  java
  • 数组中重复的数字

    在一个长度为n的数组里的所有数字都在0到n-1的范围内。
    数组中某些数字是重复的,但不知道有几个数字重复了,
    也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
    例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},
    那么对应的输出是重复的数字2或者3。

    实现

    • 数组排序
      排序后,从头到尾扫描
    public static ArrayList<Integer> getDuplicate(Integer[] nums) {
    	ArrayList<Integer> result = new ArrayList<>();
    	Arrays.sort(nums);
    	boolean mark = false;//是否连续
    
    	for (int i = 1; i < nums.length; i++) {
    		if (nums[i - 1].equals(nums[i])) {
    			if (!mark) {
    				result.add(nums[i]);
    				mark = true;
    			}
    		} else {
    			mark = false;
    		}
    
    	}
    	return result;
    }
    
    • 哈希表
    public static ArrayList<Integer> getDuplicate(Integer[] nums) {
    	ArrayList<Integer> result = new ArrayList<>();
    	HashSet<Integer> set = new HashSet<>();
    	for (int i = 0; i < nums.length; i++) {
    		if (!set.contains(nums[i])) {
    			set.add(nums[i]);
    		} else {
    			result.add(nums[i]);
    		}
    	}
    	return result;
    }
    
    • 重排数组
    public static ArrayList<Integer> getDuplicate(Integer[] nums) {
    	ArrayList<Integer> result = new ArrayList<>();
    	
    	for (int i = 0; i < nums.length; i++) {
    		while (nums[i] != i) {
    			//此时数组中下标为i 的数值也是i  则重复
    			if (nums[i].equals(nums[nums[i]])) {
    				result.add(nums[i]);
    				break;
    			}
    			swap(nums, i, nums[i]);
    		}
    	}
    	return result;
    }
    
    private static void swap(Integer[] nums, int i, Integer j) {
    	int temp;
    	temp = nums[i];
    	nums[i] = nums[j];
    	nums[j] = temp;
    }
    

    测试用例

    public void test() {
    	Integer[] a = {1, 2, 3, 2, 3};
    	ArrayList<Integer> r = getDuplicate01(a);
    	System.out.println("重复数字为:" + r);
    }
    

    输出结果

    重复数字为:[2, 3]
    

    扩展

    /**
     * a(5)b(4)c(3)d(2)e(1)
     */
    public static String getDuplicate04(char[] nums) {
    
    	StringBuilder sb = new StringBuilder();
    	Arrays.sort(nums);
    	int count = 1;
    	sb.append(nums[0]);
    	for (int i = 1; i < nums.length; i++) {
    		if (nums[i - 1]==(nums[i])) {
    			count++;
    		} else {
    			sb.append("(" + count + ")");
    			count = 1;
    			sb.append(nums[i]);
    		}
    	}
    	sb.append("(" + count + ")");
    	return sb.toString();
    }
    
  • 相关阅读:
    2020重新出发,MySql基础,MySql用户管理
    2020重新出发,MySql基础,MySql字符集
    2020重新出发,MySql基础,MySql事务
    python全栈day10
    python全栈day9
    python全栈day8
    python全栈day7
    python全栈day6
    python全栈day5
    python全栈day4
  • 原文地址:https://www.cnblogs.com/aiguozou/p/11435797.html
Copyright © 2011-2022 走看看