C语言面试题(拓展)

1、字符串中获取最长无重复字符子串。

要在字符串中找到最长的无重复字符的子串,可以使用滑动窗口技术。滑动窗口通过两个指针来表示当前窗口的起始和结束位置,并且维护一个哈希表来记录字符及其最后出现的位置,以此来确保字符不重复。

以下是用C语言实现的代码:

#include <stdio.h>
#include <string.h>
​
#define MAX_CHARS 256
​
int longestUniqueSubsttr(char *str) {int n = strlen(str);int current_len = 1;  // 当前子串的长度int max_len = 1;      // 结果int prev_index;       //前一个索引
​int *visited = (int *)malloc(sizeof(int) * MAX_CHARS);
​for (int i = 0; i < MAX_CHARS; i++) {visited[i] = -1;}
​visited[(int)str[0]] = 0;
​for (int i = 1; i < n; i++) {prev_index = visited[(int)str[i]];
​if (prev_index == -1 || i - current_len > prev_index) {current_len++;} else {if (current_len > max_len) {max_len = current_len;}current_len = i - prev_index;}
​visited[(int)str[i]] = i;}
​if (current_len > max_len) {max_len = current_len;}
​free(visited);
​return max_len;
}
​
int main() {char str[] = "abcabcbb";printf("最长无重复字符子串的长度是 %d\n", longestUniqueSubsttr(str));return 0;
}

解释:

  1. 初始化

    • visited 数组用于存储每个字符的最后出现位置,大小为 MAX_CHARS(ASCII 字符集)。

    • 初始化 visited 数组为 -1,表示所有字符初始时都未出现过。

  2. 遍历字符串

    • 对于每个字符,检查它是否在当前窗口内已出现。

    • 使用 prev_index 保存字符上次出现的位置。

    • 如果字符未出现或者不在当前窗口内,当前窗口长度 current_len 加 1。

    • 如果字符在当前窗口内已出现,更新最大长度 max_len,并重置 current_len 为当前窗口的新长度。

  3. 更新哈希表

    • 更新当前字符在 visited 中的位置。

  4. 返回结果

    • 返回最长无重复字符子串的长度。

这个算法的时间复杂度是 O(n),因为每个字符在最坏情况下也只会被访问两次(一次被加入窗口,一次被移出窗口),空间复杂度是 O(1),因为 visited 数组的大小是固定的。

2、求给定数组中出现频率最高的前n个数。

为了找到给定数组中出现频率最高的前n个数,我们需要以下步骤:

  1. 统计每个元素的出现次数:使用一个哈希表(可以用C语言中的结构体数组来实现)。

  2. 将元素及其出现次数存储在一个结构体数组中

  3. 对结构体数组按出现次数进行排序

  4. 输出前n个频率最高的元素

下面是完整的C语言实现代码:

#include <stdio.h>
#include <stdlib.h>
​
typedef struct {int value;int count;
} ElementCount;
​
int compare(const void *a, const void *b) {ElementCount *elemA = (ElementCount *)a;ElementCount *elemB = (ElementCount *)b;return elemB->count - elemA->count;
}
​
void findTopNFrequent(int arr[], int size, int n) {ElementCount *elementCounts = malloc(size * sizeof(ElementCount));int distinctElements = 0;
​// 初始化元素计数器for (int i = 0; i < size; i++) {elementCounts[i].value = 0;elementCounts[i].count = 0;}
​// 统计每个元素的出现次数for (int i = 0; i < size; i++) {int found = 0;for (int j = 0; j < distinctElements; j++) {if (elementCounts[j].value == arr[i]) {elementCounts[j].count++;found = 1;break;}}if (!found) {elementCounts[distinctElements].value = arr[i];elementCounts[distinctElements].count = 1;distinctElements++;}}
​//按照出现次数降序排序元素qsort(elementCounts, distinctElements, sizeof(ElementCount), compare);
​// 打印前n个元素for (int i = 0; i < n && i < distinctElements; i++) {printf("Element: %d, Count: %d\n", elementCounts[i].value, elementCounts[i].count);}
​free(elementCounts);
}
​
int main() {int arr[] = {1, 3, 1, 3, 2, 1, 4, 5, 2, 3, 3, 4, 5, 4, 4, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);int n = 3;
​findTopNFrequent(arr, size, n);
​return 0;
}

解释:

  1. 定义结构体 ElementCount

    • value 存储数组元素的值。

    • count 存储该元素的出现次数。

  2. 统计每个元素的出现次数

    • 遍历数组 arr,如果 elementCounts 中已存在该元素,则增加其 count

    • 如果不存在,则将该元素及其 count 初始化为1,并记录到 elementCounts 中。

  3. 排序

    • 使用 qsortelementCounts 数组按 count 从大到小排序。

  4. 输出前n个频率最高的元素

    • 遍历排序后的 elementCounts,输出前n个元素。

  5. 释放内存

    • 释放动态分配的内存 elementCounts

通过这种方法,我们可以有效地找到数组中出现频率最高的前n个数。

3、100只骆驼,100筐土豆,大骆驼背3筐,中骆驼背2筐,2只小骆驼背1筐,问有多少种组合,思路?

要解决这个问题,我们需要计算所有可能的组合方式,使得100只骆驼总共能运送100筐土豆。我们可以通过设立不同的变量表示不同类型骆驼的数量,然后利用这些变量设立方程来解决问题。具体思路如下:

变量定义

  • ( x ) 表示大骆驼的数量(每只大骆驼可以背3筐土豆)。

  • ( y ) 表示中骆驼的数量(每只中骆驼可以背2筐土豆)。

  • ( z ) 表示小骆驼的数量(每2只小骆驼可以背1筐土豆,所以一只小骆驼相当于0.5筐)。

设立方程

我们有以下两个约束条件:

  1. 骆驼总数为100只: [ x + y + z = 100 ]

  2. 背的土豆总数为100筐: [ 3x + 2y + 0.5z = 100 ]

解方程

从第一个方程我们可以得到: [ z = 100 - x - y ]

将 ( z ) 代入第二个方程: [ 3x + 2y + 0.5(100 - x - y) = 100 ]

解简化这个方程: [ 3x + 2y + 50 - 0.5x - 0.5y = 100 ] [ 2.5x + 1.5y = 50 ] [ 5x + 3y = 100 ]

现在我们只需要解这个方程就能得到所有的可能组合。具体步骤如下:

  1. 逐一尝试 ( x ) 的值从0到100之间的所有整数,判断是否有对应的 ( y ) 和 ( z ) 满足方程。

  2. 确保 ( x, y, z ) 都是非负整数。

实现代码

我们可以使用简单的C语言代码来计算所有满足条件的组合。

#include <stdio.h>
​
int main() {int x, y, z;int count = 0;
​for (x = 0; x <= 100; x++) {for (y = 0; y <= 100; y++) {z = 100 - x - y;if (z >= 0 && (5 * x + 3 * y == 100)) {printf("大骆驼: %d, 中骆驼: %d, 小骆驼: %d\n", x, y, z);count++;}}}
​printf("组合的总数: %d\n", count);
​return 0;
}

解释代码

  1. 双重循环:外部循环遍历大骆驼的数量 ( x ),内部循环遍历中骆驼的数量 ( y )。

  2. 计算小骆驼的数量 ( z ):根据 ( z = 100 - x - y ) 计算。

  3. 判断条件:检查 ( z ) 是否为非负整数,并且检查方程 ( 5x + 3y = 100 ) 是否成立。

  4. 输出结果:如果条件满足,输出对应的 ( x, y, z ) 的值并计数。

这段代码会输出所有可能的骆驼组合,并且打印出组合的总数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云岚家政】-day00-开发环境配置

文章目录 1 开发工具版本2 IDEA环境配置2.1 编码配置2.2 自动导包设置2.3 提示忽略大小写2.4 设置 Java 编译级别 3 Maven环境3.1 安装Maven3.2 配置仓库3.3 IDEA中配置maven 4 配置虚拟机4.1 导入虚拟机4.2 问题 5 配置数据库环境5.1 启动mysql容器5.2 使用MySQL客户端连接数据…

Java Socket 网络编程实例(阻塞IO、非阻塞IO、多路复用Selector、AIO)

文章目录 1. 概述2. TCP 阻塞式IO 网络编程实例2.1 TCP网络编程服务端2.2 ByteBufferUtil2.3 客户端代码2.4 运行截图 3. TCP 非阻塞式IO 网络编程实例3.1 服务端3.2 客户端3.3 运行截图 4. 多路复用4.1 服务器端4.2 客户端4.3 运行截图 5. AIO5.1 AIO 服务端5.2 客户端5.3 运行…

C++笔试强训day39

目录 1.神奇的字母&#xff08;二&#xff09; 2.字符编码 3.最少的完全平方数 1.神奇的字母&#xff08;二&#xff09; 链接https://ac.nowcoder.com/acm/problem/205832 看输出描述即可知输出次数最多的那个字母即可。 哈希表直接秒了&#xff1a; #include <iostre…

一维时间序列突变检测方法(小波等,MATLAB R2021B)

信号的突变点检测问题是指在生产实践中&#xff0c;反映各种系统工作状态的信号&#xff0c;可能因为受到不同类型的噪声或外界干扰而发生了信号突变&#xff0c;导致严重失真的信号出现&#xff0c;因此必须探测突变出现的起点和终点。研究目的在于设计出检测方案&#xff0c;…

CPU内部结构窥探·「2」

从一条汇编加法指令出发&#xff0c;分析cpu内部发生了什么&#xff1f; 本文将详细剖析ARMv8架构中加法指令的执行过程&#xff0c;深入理解其在CPU上的运行机制。 ARMv8汇编基础 在ARMv8汇编语言中&#xff0c;加法指令ADD的基本格式如下&#xff1a; ADD destination, s…

【python】python租房数据分析可视化(源码+数据+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

在Go语言中如何使用变量

1. 变量 Go 中的变量是标识符。例如&#xff0c;我们可能需要存储客户的电子邮件地址&#xff0c;但还需要确保它是有效的。这种情况下&#xff0c;可以创建一个名为 email 的变量来存储电子邮件的值。电子邮件地址可以分配给 email 变量。 变量引用一个内存地址&#xff0c;赋…

OpenCV学习(4.3) 图像阈值

1.目的 在本教程中&#xff1a; 你会学到简单阈值法&#xff0c;自适应阈值法&#xff0c;以及 Otsu 阈值法(俗称大津法)等。你会学到如下函数&#xff1a;**cv.threshold&#xff0c;cv.adaptiveThreshold** 等。 2.简单阈值法 此方法是直截了当的。如果像素值大于阈值&am…

word2016版本中同时显示多个页面

为了方便查看word内容&#xff0c;我们会将多个页面同时显示。 对于2016版&#xff0c;操作方法如下&#xff1a; 视图 ---》多页

Jan任意文件读取/下载和上传漏洞

自从ChatGPT横空出世以来&#xff0c;我一直想找一个可以自己训练的AI大模型&#xff0c;然而在使用Jan的过程中&#xff0c;数据包中传递的参数引起了我的兴趣&#xff0c;简单尝试后发现了任意文件读取和任意文件上传漏洞。 简介 Jan是ChatGPT的开源替代品&#xff0c;它在…

vuInhub靶场实战系列--bulldog-1

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 nmap主机扫描2.1.3 arp-scan主机扫描 2.2 端口扫描…

友思特案例 | 自动快速定位:使用波长选择器测量滤光片的关键光学性能指标

导读 光学滤光片检测的手动调节校准的传统方法存在诸多不确定误差和高昂的成本消耗。友思特全自动可调谐光源检测解决方案&#xff0c;可全自动调节波长带宽&#xff0c;快速收集光谱数据&#xff0c;缩短检测时间、降低质检成本&#xff0c;实现极高的准确率和快速检测效率。…

RA8D1-Vision Board上OSPI-Flash实践

Vision-Board 开发板是 RT-Thread 推出基于瑞萨 Cortex-M85 架构 RA8D1 芯片,拥有Helium和TrustZone技术的加持,性能非常强大。 内核:480 MHz Arm Cortex-M85,包含Helium和TrustZone技术 存储:集成2MB/1MB闪存和1MB SRAM(包括TCM,512KB ECC保护) 外设:兼容xSPI的四线O…

gorse修改开源项目后,如何使用Docker compose发布

代码修改 git checkout v0.4.15 修改代码后提交。 镜像构建 export GOOSlinux export GOARCHamd64 export GOMAXPROCS8go build -ldflags"-s -w -X github.com/zhenghaoz/gorse/cmd/version.Version$(git describe --tags $(git rev-parse HEAD)) -X github.com/zhengh…

如何在强数据一致性要求下设计数据库的高可用架构

在高可用的三大架构设计(基于数据层的高可用、基于业务层的高可用,以及融合的高可用架构设计)中。仅仅解决了业务连续性的问题:也就是当服务器因为各种原因,发生宕机,导致MySQL 数据库不可用之后,快速恢复业务。但对有状态的数据库服务来说,在一些核心业务系统中,比如…

运营商卷大模型,云厂商霸主地位不保?

文&#xff5c;艺 思 编&#xff5c;王一粟 经过了2023年的小试牛刀&#xff0c;2024年&#xff0c;三大运营商带着大模型一路狂飙。 刚刚过去的5月&#xff0c;中国电信、中国移动、中国联通三大运营商集体完成了新一轮的大模型进化&#xff0c;特别是围绕大模型的研发与…

【区分vue2和vue3下的element UI TimePicker 时间选择器组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 中&#xff0c;我们通常使用 Element UI 来实现时间选择器&#xff08;TimePicker&#xff09;组件。然而&#xff0c;在 Vue 3 中&#xff0c;Element UI 没有官方支持 Vue 3 的版本。但是&#xff0c;有一个名为 Element Plus 的库&#xff0c;它是 Element UI 的 V…

04--Tomcat

前言&#xff1a;本章整理tomcat的知识点&#xff0c;tomcat知识点相较nginx比较少&#xff0c;但是也是运维必会的软件&#xff0c;这里结合实际项目整理一下。 1、tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#x…

强烈安利10款手机App!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 1.听书神器——昊昊听书 昊昊听书app是一款专门为用户提供有声读物的应用程序。它不仅提供了各种类型的有声书籍&#xff0c;还有各种知名的电…

pw命令1

1、查看集群状态命令 gs_om -t status --detail 2、备节点升主&#xff08;本例子升2节点为主&#xff09; date && time cm_ctl switchover -n 2 -D /database/panweidb/data 3、cm_ctl是全局的&#xff0c;在一个节点运行 cm_ctl stop && cm_ctl start 就重…