文章目录
- 一、起因
- 二、建议
- 1、括号和缩进
- 2、仔细审题
- 3、独立思考
- 4、早起的好办法
- 5、chatgpt会代替人类吗?
- 三、解决
- 1、数据结构
- 2、初始化
- 3、判定
一、起因
事情的起因源自于星球里面一位球友的帖子,本来三点醒来上完厕所打算继续睡,突然手机响了,看了下是星球里一位球友发的消息,大概是这么一条消息:“这代码为啥不对啊,问了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;
}
更新知识星球相关内容,可以参考:英雄算法联盟 进行了解。