每日一练知识点:模拟思维和统计思维

目录

                1、题目描述

                2、解体关键知识点: 统计思维,统计法只是一种跳过过程、直接数最终状态的技巧

                3、模拟思维解题:模拟整个过程

        优化点

4、统计思维方法:

        思路:

5、对比

6、如何训练统计思维?


题目描述

学校食堂里有一排 圆形(0)和 方形(1)三明治。每个学生都有自己喜欢的三明治形状。
食堂按照栈的顺序提供三明治,而学生按照队列的顺序取餐。

  • 如果队首的学生喜欢当前最上面的三明治,他就吃掉它并离开队列。
  • 否则,他会放到队列的最后,并让队列中的下一个学生决定是否吃掉当前的三明治。

目标:计算最终无法吃到午餐的学生数量。

解体关键知识点: 统计思维,统计法只是一种跳过过程、直接数最终状态的技巧

  • 统计法是“跳脱模拟”的思维

    • 你是在按部就班地模拟整个过程,这很自然,很多人第一反应都会这么做(包括很多面试官)。
    • 统计法的思维是:“我不关心过程,我只关心最终状态”,这种思维方式需要更多的抽象能力,需要训练。
  • 统计法更像是数学推理

    • 它把问题转化为数学计数,直接看哪些人永远吃不到三明治,跳过过程,直达结果。
    • 你更习惯从具体的操作入手,而不是直接思考最终状态,这不是笨,而是思维方式的不同

模拟思维解题:模拟整个过程

func countStudents(students []int, sandwiches []int) int {
	lens := len(students)
	cal := lens
	for len(sandwiches) > 0 && cal >= 0 {
		s := students[0]
		students = students[1:]

		sw := sandwiches[0]
		if s == sw {
			sandwiches = sandwiches[1:]
			lens--
			cal = lens
		} else {
			students = append(students, s)
		}
		//fmt.Println(students, sandwiches, cal)
		cal--
	}
	return len(sandwiches)
}

完整地模拟了队列操作,通过 append 把不吃当前三明治的学生放到队列尾部,并用 cal 变量来检查是否出现循环但无人吃三明治的情况,逻辑很清晰。

不过,这种方法的时间复杂度为 O(n²),因为 students = students[1:] 每次都会重新创建切片,导致数据移动,性能会受到影响。

模拟法优化:

func countStudents(students []int, sandwiches []int) int {
    lens := len(students)
    cal := lens
    front := 0 // 记录队列的起始索引

    for front < lens && cal > 0 {
        if students[front] == sandwiches[0] { // 能吃掉三明治
            sandwiches = sandwiches[1:]
            lens--
            cal = lens
        } else { // 不能吃,移动到队列尾部
            students = append(students, students[front])
        }
        front++
        cal--
    }
    return len(sandwiches)
}

优化点

  1. 使用 front 作为队列的头指针,避免 students = students[1:] 产生 O(n²) 的切片复制。
  2. 减少切片创建,只需移动 front 而不是删除元素。
  3. 时间复杂度优化为 O(n),适合大数据量。

统计思维方法:

思路:

  1. 直接用 count[0]count[1] 统计喜欢每种三明治的学生数,避免不必要的队列操作。
  2. 逐个处理三明治,如果当前的三明治没人喜欢,直接返回剩余学生数量。
  3. 时间复杂度 O(n),空间复杂度 O(1),高效解决问题。 🚀
package main

import "fmt"

func countStudents(students []int, sandwiches []int) int {
    count := [2]int{0, 0} // count[0] 记录喜欢 0 的人数,count[1] 记录喜欢 1 的人数
    
    for _, s := range students {
        count[s]++
    }

    for _, s := range sandwiches {
        if count[s] == 0 { // 如果当前三明治没人喜欢,直接返回剩余的学生数量
            return count[0] + count[1]
        }
        count[s]-- // 有人吃掉了当前的三明治
    }
    return 0 // 全部学生都能吃到
}

func main() {
    students1 := []int{1, 1, 0, 0}
    sandwiches1 := []int{0, 1, 0, 1}
    fmt.Println(countStudents(students1, sandwiches1)) // 输出: 0

    students2 := []int{1, 1, 1, 0, 0, 1}
    sandwiches2 := []int{1, 0, 0, 0, 1, 1}
    fmt.Println(countStudents(students2, sandwiches2)) // 输出: 3
}

对比

方法时间复杂度空间复杂度适用场景
模拟过程法O(n²)O(n)适用于小数据量
优化版本(双指针)O(n)O(n)适用于大数据量
统计计数法(最优解)O(n)O(1)最快,适用于任何数据量

如何训练统计思维?

需要更习惯跳过“过程”,直接思考“状态”

  1. 每次遇到模拟类问题,想一想:

    • 有没有“不用完整模拟”的方法?
    • 我是否只需要关心某个最终数量?
  2. 多做一些类似的问题,刻意训练:

    • 1221. 分割平衡字符串(统计L和R的数量)
    • 696. 计数二进制子串(数相邻 0 和 1 的数量)
    • 2264. 字符串中最大的 3 位相同数字(直接统计)
  3. 复盘自己的代码

    • 你现在的 O(n²) 方法 已经是正确的,但可以问自己:
      • 哪些地方可以少做?
      • 哪些地方是重复的?
      • 是否可以用“统计”方式优化?
<think>好的,我需要帮助用户了解备考策略与方法。首先,用户可能想知道如何高效备考,所以得涵盖计划制定、复习技巧、资源利用等方面。 根据要求,要调用网络搜索工具,但假设我已经有相关资料。备考的关键点通常包括明确目标、时间管理、主动学习、模拟测试、健康管理心理调节。 第一步,设定明确目标。需要具体化考试内容时间节点,比如拆分知识点,制定周计划。这可能涉及SMART原则,但用户的问题里没有提到,所以可能不需要展开。 接下来是时间管理。使用番茄工作法或四象限法则,合理分配时间。需要强调优先级避免拖延,可以提到工具如待办清单或时间表。 然后是主动学习法。费曼技巧思维导图是常见方法,有助于理解记忆。需要具体说明如何应用,比如教别人或绘制结构图。 模拟测试错题分析也很重要。定期做真题,分析错误原因,归类整理。这部分要强调适应考试节奏查漏补缺。 健康管理方面,睡眠、饮食运动不可忽视。建议固定作息时间适量运动,避免熬夜。 心理调节方法,如正念冥想积极暗示,帮助缓解焦虑。保持适度压力,避免过度紧张。 最后,每个步骤需要换行,避免使用步骤词汇,确保整合信息清晰。检查是否有引用堆砌,确保分散在内容中。代码公式部分这里可能不需要,但如果有学习曲线或记忆公式,需按格式处理。 相关问题部分需要基于内容生成,比如如何制定计划、处理拖延、高效笔记、考前调整心态、平衡复习与休息、错题本制作等。选三个最相关的,确保问题符合用户可能的后续需求。</think>备考策略需结合科学规划与高效执行,重点聚焦目标管理、知识巩固心理调节。以下为系统性备考方法: **目标拆解与计划制定** 确定考试范围后按权重分配复习时间,将大目标分解为每日任务。建议采用公式量化进度: $$剩余天数 = 考试日期 - 当前日期$$ $$每日任务量 = \frac{总知识点数}{剩余天数} \times 1.2$$ 预留20%缓冲时间应对突发情况,使用甘特图或Notion等工具可视化进度。 **知识体系构建** 采用分层复习法: 1. **框架搭建**:用思维导图梳理学科主干(如数学分为代数、几何、统计) 2. **重点突破**:标记高频考点,对薄弱环节使用费曼技巧: ```text 选择概念 → 假装教授 → 发现漏洞 → 重新学习 → 简化表达 ``` 3. **交叉验证**:在不同题型中应用相同知识点(如导数既用于函数分析也用于物理速度计算) **记忆强化策略** - 间隔重复:按艾宾浩斯遗忘曲线设置复习节点(1天/3天/7天/15天) - 多感官刺激:结合听觉(录音听写)、视觉(彩色标记)、动觉(手势记忆) - 情景模拟:在类似考场环境完成限时训练,增强记忆提取能力 **应试能力提升** 建立错题本时包含: 1. 错误原因分类(概念模糊/计算失误/审题偏差) 2. 对应知识点溯源 3. 变形题目自编 定期进行全真模考,分析时间分配: $$单题耗时 = \frac{模考总时间 - 检查时间}{题目总数}$$ 调整解题顺序策略,如数学先做选择填空后攻大题 **心理状态调节** 实施「压力接种」训练: - 渐进式脱敏:从低强度练习逐步过渡到高强度模考 - 呼吸调节法:4-7-8呼吸模式(吸气4秒→屏息7秒→呼气8秒) - 认知重构:建立「失误是发现漏洞的机会」正向思维
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值