表妹问我一道大一算法题,想半天不知道怎么以简单点的方式帮她解决。。。,最后看到答案很惭愧。


事情缘由

今天,表妹问了我一道编程题,是老师布置的作业,很急!!!!!!
需要我这个 才高八斗、学富五车、鹤立鸡群、运筹帷幄、厚德载物、见多识广、文韬武略、出类拔萃、独当一面、平易近人、助人为乐、大义凛然的表geigei帮忙。
当然,作为帅气、大方、英俊、潇洒、老实、淳朴、憨厚、天真、单纯、可爱
的geigei马上就帮她想办法。
哦,有点自恋了!
在这里插入图片描述

事情如下:
在这里插入图片描述
在这里插入图片描述


一、题目

小明接到字节跳动的笔试通知,其中有一道算法题目是:有11个整数,其中有5个整数各出现2次,1个整数出现了1次,请找出这个出现1次的整数。测试数据为{32,-1,0,32,100,66,66,-7,100,0,-1}。小明知道要定义一个一维数组,并将这11个整数初始化赋值给这个数组的每一个元素。请你在小明的想法的基础上,编写程序完成这道面试题目的要求。

二、解决方法

1.思路

对于我来说,我很直,哦,因为我是直男。
我只想到有两种方法,但感觉很冗余:(如果有好的方法,评论区告诉我,蟹蟹!)
在这里插入图片描述

第一种是新建一个数组,对数组进行排列,然后对排序好的数组进行判断,如果相邻的数字相同,则删除这两个数字,不同则停止,取出第一个就是只出现一次的数字。

第二种是用键值对的方式,key是整数,value是出现的次数,然后选出出现一次的。

最后是标准的答案:定义一个次数变量k,用来判断每个整数出现的次数,由题可知,k只能等于1或2,输出k=1的整数,就是出现1次的整数。

2.代码

嗯嗯嗯,思路随便就放在代码中。。。
方法一:
新建一个数组,对数组进行排列,然后对排序好的数组进行判断,如果相邻的数字相同,则删除这两个数字,不同则停止,取出第一个就是只出现一次的数字。

int data[]={32,-1,0,32,100,66,66,-7,100,0,-1};
        int i,j,k;
        // 1.先对数组进行冒泡排序
        for(i=0;i<data.length;i++){
            for(j=i+1;j<data.length;j++){
                if(data[i]>data[j]){
                    k=data[i];
                    data[i]=data[j];
                    data[j]=k;
                }
            }
        }
        // 2.将排序后的数组赋值到动态数组
        ArrayList arr = new ArrayList();
        for(i=0;i<data.length;i++){
            arr.add(data[i]);
        }
        // 3.对排列好的动态数组,循环除去前两个相同的数字,如果前两个整数不同,则停止,结果是在动态数组第一个
       while (arr.size()>1){
            if(arr.get(0)==arr.get(1)){
                arr.remove(0);
                arr.remove(0);
                }
            else {
                break;
            }
        }
        System.out.println("这个整数为"+arr.get(0));

方法二:
用键值对的方式,key是整数,value是整数出现的次数,然后选出出现一次的。

int data[]={32,-1,0,32,100,66,66,-7,100,0,-1};
    int i=0,k=1;
    Map<Integer, Integer> map=new HashMap<>();
    // 1.对数组进行遍历判断并插入map中
    for(i=0;i<data.length;i++){
        if(map.get(data[i])!=null){
            map.put(data[i],2);
        }else {
            map.put(data[i],1);
        }
    }
    //2. 如果value的次数等于1,则输出结果
        for(Integer key:map.keySet()){
            if(map.get(key)==1){
                System.out.println("这个整数为"+key);
            }
        }

方法三:
定义一个次数变量k,用来判断每个整数出现的次数,由题可知,k只能等于1或2,输出k=1的整数,就是出现1次的整数。

int data[]={32,-1,0,32,100,66,66,-7,100,0,-1};
        int i,j,k;
        // 1.遍历取出每个整数和整个数组进行判断,整数出现一次,k=1;整数出现两次,k=2
        for(i=0;i<11;i++)
        {
            for(j=0,k=0;j<11;j++)
            {
            // 2.如果两个整数相同,次数加一
                if(data[i]==data[j])
                    k++;
            }
            if(k==1){
                System.out.println("这个整数为"+data[i]);
            }

总结

我看到题最直观的方法就是上面所说前两种方法,虽然结果正确,但确实是第三种方法最好,感觉自己是越学越退化了呀。。。
如果有好的解题方法,好的学习方法,大家一起讨论!!!
当然,如果代码有问题,欢迎指正!

@作者:加辣椒了吗?
简介:憨批大学生一枚,喜欢在博客上记录自己的学习心得,也希望能够帮助到你们!
在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

加辣椒了吗?

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

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

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

打赏作者

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

抵扣说明:

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

余额充值