题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现)

题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现)

题目: 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。要求空间复杂度为O(1)。

虽然上述的题目是一道leetcode的简单题–(剑指 Offer 03. 数组中重复的数字),但是在leetcode当中的题目并没有要求空间复杂度为O(1),因此,这道题稍微要比 leetcode 难一点,而且,在面试各种大厂的时候,如果遇到这种看似简单的题,它是一定会给加上额外的条件的,而且这里又是说到数组,那么想都不用想,就是面试官肯定让你原地进行查找或者排序啥的,这都是套路了。。。。。

代码实现:

import java.util.ArrayList;
import java.util.List;

/*
* 查找数组中的重复数字,要求是空间复杂度O(1)
* ① 查找数组的重复的数字,遇到一个重复数字就返回;
* ② 查找数组中的重复数字,将所有的重复数字打印出来。
* */
public class FindRepeatNumber {
    public static void main(String[] args) {
        int[] nums = new int[]{2,4,1,6,3,7,3,5,7,2};
        int t = findRepeatNumber(nums);
        System.out.println(t);
        System.out.println("-------");

        int[] nums1 = new int[]{4,5,2,3,4,5,3};
        List<Integer> res = findRepeatNumber1(nums1);
        for(int i = 0; i < res.size(); i++){
            System.out.println(res.get(i));
        }
    }



    //在数组中如果遇到了一个重复数字就直接返回。
    public static int findRepeatNumber(int[] nums) {
        int temp;
        for (int i = 0; i < nums.length; i++) {
            while (nums[i] != i) {
                if (nums[i] == nums[nums[i]]) {
                    return nums[i];
                }
                temp = nums[i];
                nums[i] = nums[temp];
                nums[temp] = temp;
            }
        }
        return -1;
    }

    //将数组中全部的重复数字全部输出
    //虽然我这里借助一个集合,但是我在查找重复数字的时候始终是原地查找的,即空间复杂度为O(1)
    public static List<Integer> findRepeatNumber1(int[] nums) {
        int temp;
        List<Integer> res = new ArrayList<>();
        int[] arr;
        int j = 0;
        for (int i = 0; i < nums.length; i++) {
            while (nums[i] != i) {
                if (nums[i] == nums[nums[i]]) {
                    res.add(nums[i]);
                    break;
                }
                temp = nums[i];
                nums[i] = nums[temp];
                nums[temp] = temp;
            }
        }

        return res;
    }
}

输出的结果:

3
-------
4
5
3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值