day16 JZ3 数组中重复的数字(Java)

101 阅读3分钟

题目来源: JZ3 数组中重复的数字

题目描述:

  • 描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1
    数据范围:  0n100000≤n≤10000
    进阶: 时间复杂度O(n) ,空间复杂度O(n)
  • 输入描述: 第一行输入两个整数n和k,第二行输入一个整数数组
  • 输出描述: 从小到大输出最小的k个整数,用空格分开。
示例1:
输入:[2,3,1,0,2,5,3]
输出:2
说明:2或3都是对的  

思路

新建一个数组,将原数组中的每一个数字当做新数组的下标,而新数组中存放每个下标出现的次数。 因为题目已经说了,长度为n的数组里的所有数字都在0到n-1的范围内,所以新数组的长度肯定不会超过原数组的长度,新数组最大下标就是原数组的长度n-1

具体实现:

import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 
     * @param numbers int整型一维数组 
     * @return int整型
     */
    public int duplicate (int[] numbers) {
        // write code here
        if(numbers == null || numbers.length == 0){
            return -1;
        }
        int[] res = new int[numbers.length];  //长度为n的数组里的所有数字都在0到n-1的范围内
        for(int i = 0;i < numbers.length;i ++){
            res[numbers[i]]++;
        }
        for(int i = 0;i < numbers.length;i ++){
            if(res[i] == 2){
                System.out.print(i);
                return i;
            }
        }
        return -1;
    }
}

思路杂记

1.对于上述代码中的两个for循环,其实可以简写为

        for(int i : numbers){
            res[i]++;
            if(res[i] == 2){
                return i;
            }
        }

for(int i : index)的意思就是说,遍历index数组,每次遍历的对象用i 这个对象去接收。 相当于:

int i=0; //用于接收index数组中的某一个对象
for(int j = 0;j<index.length;j++){
        i = index[j];
    }

2.上面的类名、方法名、参数名已经指定,是为了应答牛客的题,如果不受限制的话,

import java.util.Scanner;
public class day16 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        System.out.println(str);
        int[] arr = new int[10000];
        int number = 0;
        for(int i = 1;i < str.length();i +=2){
            arr[number++]=Integer.parseInt(str.substring(i,i+1));
        }
        int[] res = new int[10000];
        for(int i = 0;i < number;i ++){
            res[arr[i]]++;
        }
        for(int i = 0;i < number;i ++){
            if(res[i] == 2){
                System.out.print(i);
                return ;
            }
        }
        System.out.print(-1);
    }
}
  • static int parseInt(String s) 方法用于将字符串参数作为有符号的十进制整数进行解析
    • static int parseInt(String s, int radix)
    • 如果方法有两个参数, 使用第二个参数指定的基数,将字符串参数解析为有符号的整数。
    • parseInt(int i): 使用指定基数的字符串参数表示的整数 (基数可以是 10, 2, 8, 或 16 等进制数) 。