每日一题Day7

这篇博客介绍了三种不同的算法方法来寻找给定整数数组中缺失的数字。第一种是通过对数组排序,检查相邻元素差是否为1来找到缺失值。第二种是创建一个计数数组,记录每个数字出现的次数,找出未出现的数字。第三种是计算设想数组的总和与实际数组的总和之差。博客还提供了测试代码和运行结果,展示了各种方法的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)题目内容: 

 

 (2)思路及解题代码:

class Search{
    //思路1:将数组排序后,当某一元素与其前一个元素的差不为1时,可找到缺失的数。
    public static int SearchLostNumber1(int a[]){
       //将传入数组排序;
        Arrays.sort(a);
        //排序后首项非0则缺0,并消除索引0对下列操作的影响。
        if(a[0]!=0){
            return 0;
        }
        for (int i = 1; i < a.length ; i++) {
            if (a[i]!=a[i-1]+1){
               return a[i]-1;
            }
        }
        //[0,n]之间,经历上述操作,得知数组中数据从0开始连续,则缺失的一定为n;
     return a.length;
    }
    //思路2:定义另一个数组,记录每个数字出现次数,出现次数为零即为缺失数字。
    public static int SearchLostNumber2(int a[]){
        int b []=new int[a.length+1];
        for(int c:a){
            b[c]++;
        }
        for (int i = 0; i < b.length; i++) {
            if(b[i]==0){
                return i;
            }
        }
        //由于我们输入数组是设计好的,但编译器认为有可能会找不到。思路三和一相当于把找不到的情况与某种情况放一起了。
       return -1;
    }
    //思路3:假设不存在缺失,求设想数组(长度=实际数组长度+1)总和;再将实际数组求和,通过二者差值判断缺失数字;
    public static int SearchLostNumber3(int a[]){
        int sumOfImagine=0;
        int sumOfFact=0;
        //求设想总和[0,n]:
        int n=a.length;
        sumOfImagine=(n*(n+1))/2;

        //求实际总和:
        for (int b:a){
            sumOfFact+=b;
        }

        return sumOfImagine-sumOfFact;
    }
}

(3)测试代码及运行结果:


public class Day7 {
    public static void main(String[] args) {
        int nums1[]=new int[]{3,0,1};
        int nums2[]=new int[]{0,1};
        int nums3[]=new int[]{9,6,4,2,3,5,7,0,1};
        int nums4[]=new int[]{1,2,3};

        //1,
        System.out.print(Search.SearchLostNumber1(nums1)+" ");
        System.out.print(Search.SearchLostNumber1(nums2)+" ");
        System.out.print(Search.SearchLostNumber1(nums3)+" ");
        System.out.println(Search.SearchLostNumber1(nums4));
        //2,
        System.out.print(Search.SearchLostNumber2(nums1)+" ");
        System.out.print(Search.SearchLostNumber2(nums2)+" ");
        System.out.print(Search.SearchLostNumber2(nums3)+" ");
        System.out.println(Search.SearchLostNumber2(nums4));
        //3,
        System.out.print(Search.SearchLostNumber3(nums1)+" ");
        System.out.print(Search.SearchLostNumber3(nums2)+" ");
        System.out.print(Search.SearchLostNumber3(nums3)+" ");
        System.out.println(Search.SearchLostNumber3(nums4));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦鱼yx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值