球友的一个帖子,半夜三点给我整睡不着了……

一、起因

  事情的起因源自于星球里面一位球友的帖子,本来三点醒来上完厕所打算继续睡,突然手机响了,看了下是星球里一位球友发的消息,大概是这么一条消息:“这代码为啥不对啊,问了chatgpt他也不知道”。

二、建议

  看了这个代码,我首先有几点想法:

1、括号和缩进

  首先,这个代码缩进和括号看得很累,这样提问的时候别人看不下去,包括自己查错的时候也会看着很累,所以我们写代码的时候尽量还是要清晰,不然自己排查错误的时候也会下意识的想去求助别人。

2、仔细审题

  这道题我一开始也看错了,还以为是 最后连续k个整数的和要等于 value 则返回 true(本意其实是最后k个整数,每个整数都要等于 value 才会返回 true)。

3、独立思考

  对于这个问题,数据样例都没有过,那就应该自己好好调试,独立思考,尽量还是先自己思考,因为我看到发帖的时间是半夜1点,晚上的思路是最混乱的,最好还是先美美的睡一觉,然后早上起来再看,肯定会清晰很多。
  还有就是,这并不是一个难题,这样的简单题最好还是自己调试解决,不然后面遇到难题就会产生依赖心理。

4、早起的好办法

  每天早上起床前看看星球,看到球友的问题,加入一些自己的思考,在思考的过程中,就醒了,然后就想着赶紧把这件事情记录下来,这样就养成了早起的好习惯,妙啊!

5、chatgpt会代替人类吗?

  最近太多的圈外人在纠结这个问题,我觉得完全没必要纠结,问了chatGpt会做吗?它也不中用啊。而事实上,你需要不断去引导它,有了足够的引导,我相信他还是会的,前提就是引导的人本身是要会的,所以你还担心 ChatGpt 会代替人类吗?它只是一个工具,能够用好这个工具的不还是程序员嘛!

三、解决

  最后说说这个题。
  给定一个整数数据流,要求实现一个数据结构,检查最后 k 个整数是否都等于给定的值 value;
在这里插入图片描述
  对于这个问题,是一个经典的队列问题,可以用一个滑动窗口来解决,首先从数据结构角度去思考问题。

1、数据结构

class DataStream {
    int count;                 // 累计多少个数
    int samecount;             // 累计有多少个数的等于value
    int val;                   // 缓存构造函数的传参 val
    int K;                     // 缓存构造函数的传参 k
    queue< int > q;
}

  count 代表当前滑动窗口的长度;samecount 代表滑动窗口中元素值为 value 的数的个数; val 和 K 用于缓存传参 value 和 k。

2、初始化

  构造函数这么写就好了,四个语句比较简单。

    DataStream(int value, int k) {             
        count = 0;
        samecount = 0;
        val = value;
        K = k;         
    }

3、判定

  判定过程分为三步:
   (1)将数字塞入队列尾部,如果值等于 value 则选择给 samecount 进行自增;
   (2)判断目前滑动窗口是否小于K,如果是则直接返回;否则 samecount 和 count 相等代表:所有的值都是 value,将返回值设置为 true;这时候还不能返回,所以先缓存在 ret 中;
   (3)将滑动窗口的长度始终保持在 K-1 ,这样下一个数据接收进来以后,才能让窗口的值始终保持为 K;将队首的元素弹出的同时,更新 samecount 的值;

    bool consec(int num) {
        bool ret = false;
        
        // 1. 将数字加入队列尾部
        {
            q.push(num);                     
            ++count;                         
            samecount += (val == num) ? 1:0;
        }
        // 2. 实际判定过程
        {
            if(count < K) {
                return false;                // 小于必然返回false
            }
            if(samecount == count) {
                ret = true;
            }
        }
        // 3. 将数字从队列头部剔除
        {
            num = q.front();
            samecount -= (val == num) ? 1:0;
            --count;
            q.pop();
        }

        return ret;
    }

  更新知识星球相关内容,可以参考:英雄算法联盟 进行了解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

英雄哪里出来

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

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

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

打赏作者

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

抵扣说明:

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

余额充值