附加题 66-68

面试题66:矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

思路梳理(回溯法)

  1. 判断每个输入变量的异常情况,返回 False;
  2. 遍历输入矩阵中的每一个元素,查看该元素作为路径起点的匹配情况,
    1. 递归调用子方法去匹配整个字符串;
    2. 如果当前字符匹配,则递归调用子方法去匹配上、下、左、右四个方向;
    3. 如果当前字符不匹配,则返回False,回到主函数的遍历矩阵模块,继续匹配下一个字符为起点的路径。
    4. 增加一个已匹配字符串的长度的变量 pathLength,如果 pathLength==len(path),返回 True。
  3. 如果整个矩阵遍历之后,仍未返回值,则未匹配到字符串,返回 False。
# -*- coding:utf-8 -*-
class Solution:
    def match(self, matrix, rows, cols, path, visited, i, j, pathlength):
        # 如果已匹配的路径长度等于总路径长度,直接返回True
        if pathlength == len(path):
            return True
        hasPath = False
        # 判断当前索引是否合法,是否已经被访问过,是否可以匹配当前元素
        if i<rows and i>=0 and j<cols and j>=0 and matrix[i*cols+j] == path[pathlength] and not visited[i*cols+j]:
            pathlength += 1
            visited[i*cols+j] = True
            
            # 从四个方向上,递归匹配下一个元素,
            hasPath = self.match(matrix, rows, cols, path, visited, i+1, j, pathlength) or self.match(matrix, rows, cols, path, visited, i-1, j, pathlength) or self.match(matrix, rows, cols, path, visited, i, j+1, pathlength) or self.match(matrix, rows, cols, path, visited, i, j-1, pathlength) 
            
            # 如果不能匹配,返回 False
            if not hasPath:
                pathlength -= 1
                visited[i*cols+j] = False
                
        return hasPath
            
        
    def hasPath(self, matrix, rows, cols, path):
        if matrix == None or rows < 1 or cols < 1 or path == None:
            return False
        flag1 = [False]*rows * cols
        for r in range(rows):
            for c in range(cols):
                if self.match(matrix, rows, cols, path, flag1, r, c, 0):
                    return True
        return False                

面试题67:机器人的运动范围

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

思路梳理(回溯法)

类似于面试题66。把方格看成一个m*n的矩阵,从(0,0)开始移动。当准备进入坐标(i, j)是,通过检查坐标的数位来判断机器人能否进入。如果能进入的话,接着判断四个相邻的格子。

  • 定义子方法,判断当前位置的合法性;
  • 主方法从索引 (0, 0) 开始进入子方法,递归地寻找可用路径:
    • 定义变量 count 记录可用格子的数量,注意count的更新表达式。如果当前格子可以进入,则递归判断上、下、左、右四个方向的相邻格子。
      grid_cnt = 1+self.movCntCore(threshold, rows, cols, r+1, c, visited) + self.movCntCore(threshold, rows, cols, r, c+1, visited) + self.movCntCore(threshold, rows, cols, r-1, c, visited) + self.movCntCore(threshold, rows, cols, r, c-1, visited)
    • 子方法返回 count 值。
      注意:visited数组的定义方式、表示方式、索引方式。visited[r * cols + c]
# -*- coding:utf-8 -*-
class Solution:
    def calcSum(self, loc):
        res = 0
        # 当loc不为零时
        while loc:
            res += (loc%10)
            loc //= 10
        return res
    
    def movCntCore(self, threshold, rows, cols, r, c, visited):
        grid_cnt = 0
        if r>=0 and r<rows and c>=0 and c<cols and not visited[r * cols + c] and self.calcSum(r)+self.calcSum(c)<=threshold:
            visited[r * cols + c]=1
            
            grid_cnt = 1+self.movCntCore(threshold, rows, cols, r+1, c, visited) + self.movCntCore(threshold, rows, cols, r, c+1, visited) + self.movCntCore(threshold, rows, cols, r-1, c, visited) + self.movCntCore(threshold, rows, cols, r, c-1, visited)
            
        return grid_cnt
            
    def movingCount(self, threshold, rows, cols):
        visited = [0]*rows*cols
        return self.movCntCore(threshold, rows, cols, 0, 0, visited)
内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问。研究还提出了多项具体的技术改进向和政策建议,如优化进料式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
### 嵌入式开发面试整理 以下是基于提供的引用内容以及专业知识,针对嵌入式开发领域常见的面试目及其解答: #### 1. C语言基础 C语言作为嵌入式开发的核心工具之一,其基础知识是面试中的重点考察对象。例如,如何处理头文件重复包含的问? ```c #include <stdio.h> #ifndef TEST_H #define TEST_H // 头文件定义的内容 #endif ``` 通过条件编译指令 `#ifndef` 和 `#define` 可以有效防止头文件的多次加载[^2]。 --- #### 2. 宏定义与位操作 在嵌入式系统中,宏定义和位操作是非常重要的技能。以下是如何实现对某个特定比特位的操作: ```c #define BIT3 (0x1 << 3) static int a; void set_bit3(void) { a |= BIT3; } void clear_bit3(void) { a &= ~BIT3; } ``` 上述代码展示了如何利用按位或运算符 (`|`) 设置指定比特位,以及利用按位与非运算符 (`&=` 和 `~`) 清除指定比特位[^3]。 --- #### 3. 访问特定内存地址 嵌入式系统通常需要直接访问某些硬件寄存器所在的固定内存地址。假设需要将绝对地址为 `0x67a9` 的整型变量赋值为 `0xaa66`,可以通过指针来实现: ```c int *ptr = (int *)0x67a9; *ptr = 0xaa66; ``` 此法依赖于 ANSI 编译器支持强制类型转换的能力,从而允许程序直接操作物理地址上的数据。 --- #### 4. 静态变量的作用域 静态变量在嵌入式编程中有特殊用途。当一个变量被声明为 `static` 并位于模块内部(但不在任何函数体内)时,它的作用范围仅限于此模块内的所有函数可见,而无法被其他模块访问。这种特性有助于减少全局命名冲突并增强封装性[^5]。 --- #### 5. 存储机制对比 随着物联网技术的发展,存储管理成为另一个重要话。Web Storage 和 Cookie 是两种常用的客户端存储式,它们之间的主要区别如下表所示: | 特性 | Web Storage | Cookie | |-----------------|----------------------------------|-----------------------------------| | 数据量 | 较大(通常是几 MB) | 小(最多约 4 KB) | | 生命周期 | Session 或 Local 永久保存 | 默认随会话结束,可设过期时间 | | 发送至服务器 | 不自动发送 | 自动附加到 HTTP 请求头部 | 了解这些差异对于设计高效的嵌入式网络应用至关重要[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值