每日模拟 -- 字节
给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。
示例:
输入:A = [4,5,0,-2,-3,1], K = 5
输出:7
解释:
有 7 个子数组满足其元素之和可被 K = 5 整除:
[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]
/**
* @分析
* 1. 两次遍历 --- 超时了
*/
var subarraysDivByK = function (A, K) {
let res = 0
for (let i = 0; i < A.length; i++) {
let temp = 0
for (let j = i ; j < A.length; j++) {
temp+= A[j]
if (!(temp % K)) {
res += 1
}
}
}
return res
};
/**
* @分析
* 1. 非固定长度的滑动窗口
*/
var subarraysDivByK = function (A, K) {
let res = 0
// 窗口最大为 A.length-1,最小位 1
for(let i =1;i<A.length+1;i++){
let temp = 0
let current = 0
// 初始化窗口
while(current<i){
temp+=A[current]
current++
}
// 滑动窗口
while(current<A.length){
if(temp % K==0) res++
temp = temp-A[current-i]+A[current]
current++
}
if(temp % K==0) res++
}
return res
}
感想
- 最近看了一些非技术的文章,包含学习、写作、投资等等,慢慢对自己的一下计划进行微调,当然年度的大路线,早起+算法+输出 不变,但是选型确实做出了改变
- 一直做单类题很好,把题刷完了,我可能能对这类题有更深的感悟,但是刷题到底是为了什么
- 然后我继续读到 ”技术是为了业务服务的“, 那么算法这个技术,要为什么 ”业务“ 服务呢?
- 所以还是得回归初心,我刷算法的初心,起码回溯到上一个还未完成的目标,是什么呢?显而易见的,为大厂面试做准备
- 可能等我面过了大厂,会慢慢的强化自己,但是很现实的问题是,如果只刷一部分题,没法面试成功,但是我又拿不出更多的时间做算法,因为大厂不单单面算法,所以只能先做取舍,把大厂的真题刷了;
- LC 有一个很好玩的功能,就是模拟面试,每次抽3题,1个半小时,抽的是哪个大厂再 LC 上的题库,可信度还是蛮高的,所以就以这个为目标吧。
- 1个月之后,能够在指定时间内,通过模拟面试。
- 不要被身边的繁华迷失了最初的目的,技术只是手段,只是工具,只是实现目标的方法而已,不要沉迷技术,更别说技术还不行。
以上,共勉!