嵌入式软件C语言面试常见问题及答案解析(三)
上一篇已经足够长了,再长也就有点不礼貌了,所以在这儿继续来总结分享那个面试中遇到的题目,文中的问题和提供的答案或者代码均代表个人的理解,如有不合理或者错误的地方,欢迎大家批评指正。
本文中题目列表
- 1. 编码实现子串定位
- 2. 找出两个字符串中最大公共子字符串
- 3. 在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
- 4. 把字符1串插入到字符串2中
- 5. 在字符串中找出连续最长的数字串,并把这个串的长度返回
- 6. 实现删除字符串str1中含有的字符串str2
- 7. 写一个函数,找出被重复的数字,时间复杂度必须为O(n)
- 8. 结构体、联合体占用内存问题
- 9. 请写出以下数据类型与零值比较的if语句。
- 10. 如下程序运行结果是什么。
- 11. 使用宏(或者函数)实现两个数的交换的功能。
- 12. 已知类String的原型如下,编写类String的构造函数,析构函数和赋值函数。
- 13. 不用库函数,用C语言实现将一整型数字转化为字符串。
- 14. 用指针的方法,将字符串“ABCD1234efgh”前后对调显示。
- 15. 判断一个字符串是不是回文。
1. 编码实现子串定位
题目:编码实现子串定位,函数原型为int FindSubStr(const char *MainStr, const char *SubStr)。
查找子串的位置,其功能类似与函数
strstr(),其函数原型是char *strstr(const char *haystack, const char *needle)。本文中实现的方式比较简单明了,注释也很详细。参考代码如下。
int FindSubStr(const char *MainStr, const char *SubStr)
{/* 定义位置临时变量,初始化为0,表示没找到 */int t_index = 0;char *t_main_str = MainStr;char *t_sub_str = SubStr;/* NOTE 下面这部分代码(SECTION -> !SECTION)为冗余设计,如果写上了说明你对于一些异常情况有考虑并处理的能力,算是加分项 *//* SECTION 参数判断 */if (NULL == t_main_str || NULL == t_sub_str) /* 空指针判断 */return -1;int t_main_len = strlen(MainStr);int t_sub_len = strlen(SubStr);if (t_main_len == 0 || t_sub_len == 0) /* 字符串长度判断,长度为0那就没有继续的必要了 */return -2;if (t_main_len < t_sub_len) /* 子串长度比主串长,玩呢 */return -3;/* !SECTION 参数判断 *//* 结束查找的条件,主串到结尾 */while (*t_main_str != '\0'){/* 两个字符串都没有到结为,并且 子串与主串字符相同 */while (*t_main_str && *t_sub_str && *t_main_str == *t_sub_str){/* 记录当前位置(PS:此位置不一定是最终结果,当做标识使用) */t_index = (t_main_str - MainStr) + 1;/* 移动指针 */t_main_str++;t_sub_str++;}/* 子串到结尾了(PS:说明前面的执行已经匹配到了完整的子串) */if (*t_sub_str == '\0'){/* 计算子串在主串中的开始的位置 */t_index = (t_main_str - MainStr) + 1 - (t_sub_str - SubStr);/* 跳出循环(PS:必须的)*/break;}/* 如果位置不为0,说明匹配到了一些字符,但是没有匹配完整的子串 */if (t_index != 0){/* 指针要做后退一个,不然后面的++会导致跳过一个字符 */t_main_str--;/* 当然临时的标识也要恢复 */t_index = 0;/* 重新开始匹配子串 */t_sub_str = SubStr;}/* 无条件移动主串的指针 */t_main_str++;}/* 返回位置 */return t_index;
}
2. 找出两个字符串中最大公共子字符串
题目:找出两个字符串中最大公共子字符串,如"abccade",“dgcadde"的最大子串为"cad”。
像这种只有题目要求和举例说明的题目,编码相对来说比较灵活了,但是在定义函数的时候相关参数和返回值都要尽量体现其合理性的,当然只要正当的考虑即可,下面给出两种实现的方案供参考(方案二中使用
malloc()函数,但是需要调用者去free,这是个坑)。
// 方案一:直接通过参数输出公共子串在任一字符串中其实位置,通过返回值输出公共子串的长度
int FindCommonStr(const char *str1, const char *str2, char **comm)
{char *t_str1 = (char *)str1;char *t_str2 = (char *)str2;char *t_common = NULL;int i = 0, j = 0, k = 0, t_len = 0, t_maxlen = 0;/* 参数判断 */if (NULL == t_str1 || NULL == t_str2 || NULL == comm){return -1;}/* 字符串中一个字符一个字符判断 */for (i = 0; t_str1[i] != '\0'; i++){/* 保存字符串1当前位置,后面需要自增 */k = i;/* 字符串中一个字符一个字符判断 */for (j = 0; t_str2[j] != '\0'; j++){/* 相同字符的长度,每次重新开始 */t_len = 0;/* 两个字符串的字符一致 */if (t_str1[k] == t_str2[j]){while ('\0' != t_str1[k] && /* 字符串没到结束 */'\0' != t_str2[j] && /* 字符串没到结束 */t_str1[k] == t_str2[j]) /* 字符一致 */{/* 指针后移 */k++;j++;/* 相同字符长度自增 */t_len++;}/* 本次相同字符长度大于记录的最大长度 */if (t_len > t_maxlen){/* 更新最大长度 */t_maxlen = t_len;/* 记录公共子串起始的位置 */t_common = &t_str1[i]; /* NOTE 如果取另一字符串的话则是:&t_str2[j - t_len]; */}}}}/* 输出公共子串 */*comm = t_common;/* 返回公共子串的长度 */return t_maxlen;
}// 方案二:通过返回值返回最大公共子串,此方案最贴近题目要求,但是需要注意的是 malloc 调用
char *FindCommonStr(const char *str1, const char *str2)
{char *t_str1 = (char *)str1;char *t_str2 = (char *)str2;int i = 0相关文章:
嵌入式软件C语言面试常见问题及答案解析(三)
嵌入式软件C语言面试常见问题及答案解析(三) 上一篇已经足够长了,再长也就有点不礼貌了,所以在这儿继续来总结分享那个面试中遇到的题目,文中的问题和提供的答案或者代码均代表个人的理解,如有不合理或者错误的地方,欢迎大家批评指正。 本文中题目列表 1. 编码实现子串定…...
nvm安装教程
Node Version Manager (NVM) 是一个用来管理多个 Node.js 版本的命令行工具。使用 NVM,你可以在同一台机器上轻松安装和切换不同的 Node.js 版本。以下是针对 Unix 类系统(如 Linux 和 macOS)的 NVM 安装教程: 安装 NVM 更新系统…...
单片机-定时器中断
1、相关知识 振荡周期1/12us; //振荡周期又称 S周期或时钟周期(晶振周期或外加振荡周期)。 状态周期1/6us; 机器周期1us; 指令周期1~4us; ①51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器…...
Hadoop 实战笔记(一) -- Windows 安装 Hadoop 3.x
环境准备 安装 JAVA 1.8 Java环境搭建之JDK下载及安装下载 Hadoop 3.3.5 安装包 Hadoop 下载:https://archive.apache.org/dist/hadoop/common/ 一、JAVA JDK 环境检查 二、Hadoop(HDFS)环境搭建 1. 解压安装文件 hadoop-3.3.5.tar 2. 配置环境变量 HADOOP_HO…...
AI中的神经元与权重矩阵之间的关系;神经元连接角度看行和列的意义
AI中的神经元与权重矩阵之间的关系 目录 AI中的神经元与权重矩阵之间的关系神经元连接角度看行和列的意义AI中的神经元概念 在人工智能领域,特别是神经网络中,神经元是基本的计算单元,它是对生物神经元的一种抽象模拟。就像生物神经元接收来自其他神经元的电信号,经过处理后…...
mysql、postgresql、druid链接池踩坑记录
The last packet successfully received from the server wIs 10,010 milliseconds ago. The last packet sent successfully to the server was 10,010 milliseconds ago.### The error may exist in URL mysql 链接字符串没有 &connectTimeout600000&socketTimeout6…...
NRF24L01模块STM32通信-通信初始化
目录 前言 一、IO口初始化 二、模拟SPI的基础代码 1.一些代码的宏定义 2.起始信号 3.CS,SCK,MOSI操作 4.MISO,IRQ操作 三.中间层代码 1.字节的输入和读取 2.写操作 3.读操作 四.应用层代码 1.24L01的检测 2.在main函数进行简单验证 3.24L01宏定义的代码 总结 前…...
高比例压缩:Linux 中的压缩命令与技巧
文章目录 高比例压缩:Linux 中的压缩命令与技巧1. 压缩格式的选择2. gzip 命令示例:压缩文件示例:解压文件 3. bzip2 命令示例:压缩文件示例:解压文件 4. xz 命令示例:压缩文件示例:解压文件 5.…...
LabVIEW软件Bug的定义与修改
在LabVIEW软件开发过程中,bug(程序错误或缺陷)指的是程序中导致不符合预期行为的任何问题。Bug可能是由于编码错误、逻辑漏洞、硬件兼容性问题、系统资源限制等因素引起的。它可能会导致程序崩溃、功能无法正常执行或输出结果不符合预期。理解…...
基于Springboot + vue实现的办公用品管理系统
🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…...
B+树的原理及实现
文章目录 B树的原理及实现一、引言二、B树的特性1、结构特点2、节点类型3、阶数 三、B树的Java实现1、节点实现2、B树操作2.1、搜索2.2、插入2.3、删除2.4、遍历 3、B树的Java实现示例 四、总结 B树的原理及实现 一、引言 B树是一种基于B树的树形数据结构,它在数据…...
(四)结合代码初步理解帧缓存(Frame Buffer)概念
帧缓存(Framebuffer)是图形渲染管线中的一个非常重要的概念,它用于存储渲染过程中产生的像素数据,并最终输出到显示器上。简单来说,帧缓存就是计算机图形中的“临时画布”,它储存渲染操作生成的图像数据&am…...
python注意事项:range遍历越索引现象、列表边遍历边修改出现的问题
文章目录 前言一、range遍历越索引现象QS1:遍历range(2,2)会发生什么?不会报错,但是也不会遍历到任何内容QS1:遍历range(3,2)会发生什么?不会报错,但是也不会遍历到任何内容 二、列表边遍历边修改注意事项(Java的List系…...
【C++】模板与泛型编程(三):重载与模板
16.3 重载与模板 函数模板可以被另一个模板或一个普通分模板函数重载。与往常一样,名字相同的函数必须具有不同数量或类型的参数(这样才可以完成重载)。 如果设计模板,则函数的匹配规则与普通函数的重载有所不同,具体…...
JavaScript字符串拓展:实用方法与示例全解析
一、引言:为什么要学习 JS 字符串拓展 在前端开发的世界里,JavaScript 如同基石般支撑着网页的交互与动态呈现。而字符串作为我们日常操作中最频繁接触的数据类型之一,其原生方法在面对复杂多变的业务需求时,有时难免显得捉襟见肘…...
基于html5实现音乐录音播放动画源码
源码介绍 基于html5实现音乐录音播放动画源码是一款类似Shazam的UI,点击按钮后,会变成为一个监听按钮。旁边会有音符飞入这个监听按钮,最后转换成一个音乐播放器。 效果预览 源码获取 基于html5实现音乐录音播放动画源码...
初学stm32 --- ADC模拟/数字转换器工作原理
目录 常见的ADC类型 并联比较型工作示意图 逐次逼近型工作示意图 ADC的特性参数 STM32各系列ADC的主要特性 ADC框图简介 参考电压/模拟部分电压 输入通道( F1为例) 转换序列(F1为例) 规则组和注入组执行优先级对比 规则…...
导航技术的分类
导航技术可以根据不同的分类标准进行划分,以下是从不同角度对导航技术的分类: 一、按导航信息获取原理分类 无线电导航:利用无线电波的传播特性来测定运动体的位置、速度等导航参数。常见的无线电导航系统包括罗兰-C、奥米加、台卡等。卫星…...
C++语言的函数实现
C语言中的函数实现详解 C是一种强大的编程语言,广泛应用于系统软件、游戏开发、实时物理模拟等多个领域。在C中,函数是组织和重用代码的重要工具。本文将深入探讨C中的函数实现,包括函数的定义、调用、重载、递归、作用域、内联函数和模板函…...
每日一题-两个链表的第一个公共结点
文章目录 两个链表的第一个公共结点问题描述示例说明示例 1示例 2 方法及实现方法描述代码实现 复杂度分析示例运行过程示例 1示例 2 总结备注 两个链表的第一个公共结点 问题描述 给定两个无环的单向链表,找到它们的第一个公共节点。如果没有公共节点,…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
