首页 > 其他分享 >剑指offer面试题3:数组中重复的数字

剑指offer面试题3:数组中重复的数字

时间:2023-09-12 15:03:35浏览次数:35  
标签:面试题 return 数字 offer int 元素 numbers 数组

一、知识点:

数组相关知识

二、描述

在一个长度为n的数组里的所有数字都在0~n-1范围内,数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道重复几次。请找出数组中任意一个重复的数字,例如:输入长度为7的数组[2,3,2,4,3,3,5],那么输出2或者3都是正确的,存在不合法的输入的话输出-1。

数据范围:0≤n≤10000 

进阶:时间:时间复杂度O(n),空间复杂度O(n)

三、代码

3.1方法一:位置重排(O(n),O(1))

3.1.1思路

长度为n的数组中数字都在0~n-1范围内,如果这个数组中没有重复的数字,那么数组排序之后数字i将出现在下标为i的位置,由于数组中有重复的数字,有些位置可能存在多个数字,同时有些位置可能没有数字。

3.1.2具体做法

从头到尾依次扫描数组中的每个数字,当扫描到下标为i的数字时,首先比较这个数字(值记为m)是不是i

如果m == i,那么继续扫描下一个数字

如果m != i,那么就拿这个数字和第m个位置上的数值进行比较

如果两个值相等,则找到重复数字

如果不相等,则交换第i位上的数字和第m位上的数字,

接下里进行重复比较、交换的过程,直到找到重复的数字。

数组存放原则:numbers[i] = i

遍历数组所有元素,交换不符合数组存放原则的元素:

例如[2,3,1,0,2]

遍历0位元素2:(交换0位元素2和2位元素1)->[1,3,2,0,2]

遍历0位元素1:(交换0位元素1和1位元素3)->[3,1,2,0,2]

遍历0位元素3:(交换0位元素3和3位元素0)->[0,1,2,3,2]

依次遍历0、1、2、3位置元素,都符合存放原则numbers[i] = i,不做任何操作

遍历末位元素2,此时末位元素2和2位元素2相等,出现了两次,即数字2位重复元素

3.1.3图示

剑指offer面试题3:数组中重复的数字_i++

3.1.4Java实现

import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param numbers int整型一维数组 
     * @return int整型
     */
    public int duplicate (int[] numbers) {
        // write code here
        int length = numbers.length;
        if(length == 0) 
            return -1;
        for(int i = 0; i < length; i++){
        	if(numbers[i] < 0 || numbers[i] > length -1)
                return -1;
        }
        for(int i = 0; i < length; i++){
        	while(numbers[i] != i){
                int temp = numbers[i];
                if(temp == numbers[temp])
                    return temp;
                numbers[i] = numbers[temp];
                numbers[temp] = temp;
            }
        }
        return -1;
    }
}
3.2方法二:使用Java的set特性

3.2.1Java代码

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param numbers int整型一维数组 
     * @return int整型
     */
    public int duplicate (int[] numbers) {
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < numbers.length; i++) {
            if (!set.add(numbers[i])) {
                return numbers[i];
            }
        }
        return -1;
    }
}
3.3方法二:使用Hashmap结构

3.3.1Java代码

import java.util.*;

public class Solution {
    public int duplicate (int[] numbers) {
        int len=numbers.length;
        if(len==0 ||len==1)
            return -1;
        HashMap<Integer,Boolean> map=new HashMap<Integer,Boolean>();
        for(int i=0;i<len;i++){
            //若已存在,则插入为true,否则插入为false
            map.put(numbers[i],map.containsKey(numbers[i]));
        }
        for(int i=0;i<len;i++){
            if(map.get(numbers[i]))
                return numbers[i];
        }
        return -1;
    }
}


标签:面试题,return,数字,offer,int,元素,numbers,数组
From: https://blog.51cto.com/u_16244372/7445424

相关文章

  • Java比较两个数组内容是否相同
    数组内容相同   需求:设计一个方法,用于比较两个数组内容是否相同   思路:1.定义两个数组,分别使用静态初始化完成数组元素的初始化   定义一个方法,用于比较两个数组的内容是否相同   返回值类型:boolean   参数:int[]arr,int[]arr2   比较两个数组的内容是否相......
  • 树状数组--模板
    #include<stdio.h>#include<string.h>#defineN50050intn;intin[N];intLowbit(intt){ returnt&(-t);}intSum(intp){ intsum=0; while(p>0) { sum+=in[p]; p-=Lowbit(p); } returnsum;}voidplus(intp,intnum){ while(......
  • Leetcode 26. 删除有序数组中的重复项
    题目描述给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。双指针Python实现defremoveDuplicates(nums:List[int])->int:......
  • javascript事件循环机制及面试题详解
    javascript事件循环机制及面试题详解 javascript是单线程执行的程序,也就是它只有一条主线,所有的程序都是逐行“排队”执行,在这种情况下可能存在一些问题,比如说setTimeout、ajax等待执行的时间较长,就会阻塞后续代码的执行,使得整个程序执行的耗时非常久,那么为了应对这样一个问......
  • Golang 错误处理丶数组丶切片丶随机数
    一.错误处理1//错误处理2functestError(){3errorExec:=func(){4err:=recover()//recover是内置函数,可以捕获异常5iferr!=nil{//说明捕获到错误6fmt.Println("err=",err)7}8}9err......
  • LeetCode523——连续的子数组和
    给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:子数组大小 至少为2 ,且子数组元素总和为 k 的倍数。如果存在,返回 true ;否则,返回 false 。如果存在一个整数 n ,令整数 x 符合 x=n*k ,则称 x 是 ......
  • 剑指 Offer 67. 把字符串转换成整数
    题目链接:剑指Offer67.把字符串转换成整数题目描述:写一个函数StrToInt,实现把字符串转换成整数这个功能。不能使用atoi或者其他类似的库函数。解法思路:直接模拟题代码:funcstrToInt(sstring)int{s=strings.Trim(s,"")minus:=1varansint64=......
  • 求数组中第三大的数
    //1.从数组中找出第三大的数,例如{10,10,9,9,8,8,7,7}第三大的数是8publicclassThirdLargestNumber{publicstaticvoidmain(String[]args){int[]nums={10,10,9,9,8,8,7,7};intthirdLargest=findThirdLargest(nums);System.......
  • 剑指 Offer 66. 构建乘积数组
    题目链接:剑指Offer66.构建乘积数组题目描述:**给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B[i]的值是数组A中除了下标i以外的元素的积,**即B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。解法思路:代码:funcconstructArr(a[......
  • 剑指 Offer 65. 不用加减乘除做加法
    题目链接:剑指Offer65.不用加减乘除做加法题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用“+”、“-”、“*”、“/”四则运算符号。解法思路:不用加减乘除,那么可以用位运算代替:可以用a^b运算表示无进位的加法可以用(a&b)<<1表示进位因此a+b=a^b+((a......