前言
所有题目结果和解释由笔者给出,答案主观性较强,若有错误欢迎评论区指出,资料整理来自于“数字IC打工人”等数字IC相关公众号,牛客网等网站真题、网络笔试真题及面经抄录。
python、C语言、脚本编程题
1. 请用C语言写一个程序,计算输入字符串中每个字母的个数(字符串只包括小写字母)。举例如输入字符串为:aaaaabbcccefff,则结果打印为:5a2b3c1e3f。(联发科2022提前批)
答案:C语言编程题,需要记得一些C语言的基本语法,熟悉一下指针和数组,这类题目一般都不会太难。
#include <stdio.h>
void main(){
char str[100] = {0};
int count[26] = {0};
int i = 0;
int count_index;
scanf("%s", str);
while(str[i] != '\0'){
count_index = (str[i]- 'a');
count[count_index] = count[count_index] + 1;
i++;
}
for(i=0;i<26;i++){
if(count[i]!=0){
printf("%d%c",count[i],'a'+i);
}
}
printf("\n");
}
输出结果:
2. [python]请使用种您熟悉的语言(C, Java, Python)定义二叉树的节点,并使用深度优先搜索,获取一个给定二叉树的最大深度,返回深度值。(联发科2022提前批)(同时也是Leecode easy 题)
比如,给定二叉树[3,9,20, null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度3.
答案:定义一个二叉树的结点结构体TreeNode,然后用递归的方式去访问二叉树的所有叶子节点,退出条件为not root,即root = None,即不存在的节点,此时not root 为真,退出该次递归函数。
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def maxDepth(self, root):
length = 0
def dfs(root, d):
nonlocal length
if not root:
return
length = max(length,d)
dfs(root.left, d+1)
dfs(root.right, d+1)
dfs(root, 1)
return length
if __name__ == '__main__':
# 定义题中所给的树
root = TreeNode(3)
root.left = TreeNode(9)
node = TreeNode(20)
root.right = node
node.left = TreeNode(15)
node.right = TreeNode(7)
s = Solution() # 例化类,才能调用类中的类函数
print(s.maxDepth(root))
3. [python]给你个字符串表达式s,请使用一种您熟悉的语言(C Java, Python)实现一个基本计算器来计算并返回它的值(运算只包含+-和括号)。(联发科2022提前批)
示例1:
输入:s=“1+1”
输出:2
示例2:
输入:s=“2-1+2”
输出:3
示例3:
输入:s=“2-1+2”
输出:3
示例3:
输入:s=“(1+(4+5+2)-3)+(6+8)”
输出:23
代码:
使用栈存储当前括号外的结果和符号,并使用递归处理括号内的表达式。在循环中分别处理数字、加号、减号和括号。如果遇到数字,则计算当前数字;如果遇到加号或减号,则将当前数字和符号推入栈中,并将当前数字和符号重置;如果遇到左括号,则递归处理括号内的表达式,并返回括号内的计算结果和括号结束的位置;如果遇到右括号,则将当前数字和符号推入栈中,并返回括号外的计算结果以及右括号结束的位置。
最后,我们将栈中的所有数字和符号相加,就可以得到整个表达式的计算结果。
def calculate(s: str) -> int:
num = 0 # 记录当前数字
sign = 1 # 记录当前符号
stack = [] # 用来存储当前括号外的结果和符号
res = 0 # 用来记录最终结果
for i in range(len(s)):
if s[i].isdigit():
num = num * 10 + int(s[i])
elif s[i] == '+':
res += num * sign
num = 0
sign = 1
elif s[i] == '-':
res += num * sign
num = 0
sign = -1
elif s[i] == '(':
stack.append(res) # 先存结果,再存数字
stack.append(sign)
res = 0
sign = 1
elif s[i] == ')':
res += num * sign
num = 0
res *= stack.pop()
res += stack.pop()
return res + num * sign
if __name__ == '__main__':
s = "(1+(4+5+2)-3)+(6+8)"
print(calculate(s))
输出结果:23
4. [Python]请用python写一段程序,用尽量少的语句实现下面功能:定义一个函数,判断给定目录下是否存在result.log文件,如果存在,则从result.log文件中找出所有包含fail字样(不区分大小写)的行,并将这些内容保存到一个名为fail.log的文件中,如果文件不存在则抛出异常()(联发科2022提前批)
代码:使用了os模块中的join()函数来拼接目录路径和文件名,open()函数以只读模式打开result.log,并以写入模式打开fail.log文件,lower()函数将每行字符串中的字母转为小写字母,writelines()函数将包含fail字样的行写入fail.log文件中。程序还使用了异常处理机制来处理找不到result.log文件的情况。
import os
def find_fail_lines(dir_path):
try:
with open(os.path.join(dir_path, 'result.log'), 'r') as f1, open(os.path.join(dir_path, 'fail.log'), 'w') as f2:
fail_lines = [line for line in f1 if 'fail' in line.lower()]
f2.writelines(fail_lines)
print('Successfully saved fail lines to fail.log')
except FileNotFoundError:
print('result.log file not found in the directory')
# example usage
find_fail_lines('E:/modelsim_project/file_handle/')
5.请写段Python代码,打开一个文件,扫描每行,如果该匹配到“biren01”,“biren02”,……“biren99”则以行号Key,将匹配到的“birenxx”保存下来(2022壁仞)
要写这段代码要知道,在 Python 中,可以使用 enumerate 函数来同时获取文件的行号和内容,例如:
with open('file.txt') as file:
for i, line in enumerate(file, 1):
print(f"Line {i}: {line}",end="")
其中变量i为行的行号,变量line存储一整行,结果展示如下:
代码:
keywords = {} # 创建一个空字典,用于保存匹配到的关键字和行号
with open('file.txt') as file:
for i, line in enumerate(file, 1):
for j in range(1, 100):
keyword = f'biren{j:02d}' # 生成关键字,如 'biren01'、'biren02' 等
if keyword in line:
if i not in keywords: # 如果当前行号还没有在字典中出现过,则添加新的键值对
keywords[i] = [keyword]
else: # 如果当前行号已经在字典中存在,则将匹配到的关键字添加到已有的列表中
keywords[i].append(keyword)
for key, value in keywords.items():
print(f"行号 {key},匹配到的字符为:{value}")
第五行f'...' 表示一个格式化字符串,其中 {j:02d} 是一个占位符,表示将 j 的值格式化为两位数字,并且如果 j 不足两位,则在前面补零。这里的 d 表示将 j 格式化为十进制整数。因此,对于 j=1,生成的字符串就是 'biren01',代码输出结果如下:
6. 用C语言统计100~1000里面共有多少个素数,并且把所有素数打印出来。素数又称质数。所谓素数是指除了1和它本身以外,不能被任意整数整除的数.
写一个判断是否是素数的函数,返回True or False,做个循环,对i=2到i = 根号num范围进行遍历,如果num对i取模等于零,代表i是num的因数。
#include <stdio.h>
int is_prime(int num) {
if (num <= 1) {
return 0;
}
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return 0;
}
}
return 1;
}
int main() {
int count = 0;
printf("素数有:");
for (int i = 100; i <= 1000; i++) {
if (is_prime(i)) {
count++;
}
}
printf("共有%d个素数\n", count);
return 0;
}
7. [python]现在有两个数组a=[1,1,2,4,5],b=[1, 1,2,3,7],请用python/perl实现,找到这两个数组的交集和并集
这里直接用python的集合变量set来做。
a = [1,1,2,4,5]
b = [1,1,2,3,7]
intersection_A_B = set(a)-(set(a)-set(b))
union_A_B = set(a).union(set(b))
print(intersection_A_B)
print(union_A_B)
代码结果:
8. Please use any a programming language to locate the largest element in the matrix(矩阵)and print largest value,row and column of this largest value.
Matrix: matrix [3][4]={{0,1,2,3},{8,7,6,5},{-5,9,-3,4}}
#include <stdio.h>
int main(void){
int matrix[3][4] = {{0,1,2,3},{8,7,6,5},{-5,9,-3,4}};
int row,column,max;
max = 0;
for (int i =0;i<=2;i++){
for(int j=0;j<=3;j++){
if(matrix[i][j]>=max){
row = i;
column = j;
max = matrix[i][j];
}
}
}
printf("max value is:%d,the row is:%d,the column is:%d\n",matrix[row][column],row+1,column+1);
}