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

    题目描述

    在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
     
    解法一:不修改数组找出重复的数字
    如果在不修改输入数组的前提下,我们可以创建一个长度为n+1的辅助数组,然后逐一把原数组的每个数字复制到辅助数组。如果原数组中被复制的数字是m,则把它复制到辅助数组中下标为m的位置。这样很容易发现哪个数字是重复的,由于需要创建一个数组,该方案需要O(n)的辅助空间。
     下面这个思路是典型的拿空间换时间,时间上,只需要遍历一遍就把所有事情都做了,代价就是花费了额外的两个数组来存储数据
    public class Test17 {
        public static void main(String[] args) {
            int[] numbers = { 2, 3, 2, 0, 2, 5, 3 };
            int[] flag = new int[numbers.length];
            int[] duplication = new int[numbers.length - 1];
            duplicate(numbers, flag, duplication);
            for (int i = 0; i < flag.length; i++) {
                System.out.print(flag[i]);
            }
            System.out.print("
    ");
            for (int i = 0; i < duplication.length; i++) {
                System.out.print(duplication[i]);
            }
        }
    
        public static void duplicate(int[] numbers, int[] flag, int[] duplication) {
            int num = 0;//加一个int型的位置标记,标记出现了几个重复的数字了
            for (int i = 0; i < duplication.length; i++) {
                duplication[i] = -1;// 不加这个的话,默认全是0,如果0重复了你怎么存,你怎么知道0重复没重复
            }
            for (int i = 0; i < numbers.length; i++) {//for循环里不能有return,保证全部遍历一遍
                flag[numbers[i]]++;
                if (flag[numbers[i]] == 2) {// 重复其实可以理解成出现次数2次;>1是出现次数大于1的,包括重复的,包括重复好大于2次的;如果统计出现次数3次的呢,就改成3
                    duplication[num++] = numbers[i];
                }
            }
        }
    
    }

     测试用例:

    长度为n的数组里包含一个或者多个重复是数字;

    数组中不包含重复的数字。

    无效输入测试用例(输入空指针)

  • 相关阅读:
    Python Web框架Django (三)
    谷歌把域名标记为不安全的解决办法
    tkmybatis VS mybatisplus
    jdbc预编译实现方式
    分析mybatis中 #{} 和${}的区别
    实体类id的几种生成方式
    java 获取mac地址
    javafx 表格某一列设置未复选框
    关闭在chrome里使用双指前进后退页面的功能
    调试maven源代码
  • 原文地址:https://www.cnblogs.com/guweiwei/p/6837743.html
Copyright © 2011-2022 走看看